DotNet 核心依赖注入多个项目
DotNet Core Dependency Injection Multiple Projects
我正在构建 Blazor WASM 应用程序。
该应用程序正在运行,但我现在希望将项目拆分为合理的自包含项目,但在解决如何在不在项目之间创建循环依赖的情况下实施依赖项注入时遇到问题。
Projects:
App.Client - UI Razor Pages
App.Server - Main project, controllers, defines interfaces
App.Shared - Shared models between Client & Server
App.Data - Implements repositories, unit of work, Db Context, migrations
我遇到的问题是 App.Data 项目依赖于 App.Server 项目来实现它需要的接口,但是我不确定如何在startup.cs 文件在 App.Server 项目中,因为它不能依赖于 App.Data 项目。
Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Test.Models;
using Test.Models.Data;
namespace Test
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("database"), b => b.MigrationsAssembly("Test")));
services.AddIdentity<User, Role>()
.AddEntityFrameworkStores<AppDbContext>()
.AddDefaultTokenProviders();
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAntiforgery antiforgery)
{
...
}
}
}
项目结构
我最终结合了这两条评论来实现为 Blazor WASM 应用程序修改的 Clean Architecture 结构。
添加一个核心项目,定义接口,以及实现基础设施接口(如数据库)的基础设施项目。然后服务器依赖于这 2 个项目,这是有道理的。
启动然后通过 DI 配置接口,使用核心或基础结构中的适当实现。
我正在构建 Blazor WASM 应用程序。
该应用程序正在运行,但我现在希望将项目拆分为合理的自包含项目,但在解决如何在不在项目之间创建循环依赖的情况下实施依赖项注入时遇到问题。
Projects:
App.Client - UI Razor Pages
App.Server - Main project, controllers, defines interfaces
App.Shared - Shared models between Client & Server
App.Data - Implements repositories, unit of work, Db Context, migrations
我遇到的问题是 App.Data 项目依赖于 App.Server 项目来实现它需要的接口,但是我不确定如何在startup.cs 文件在 App.Server 项目中,因为它不能依赖于 App.Data 项目。
Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Test.Models;
using Test.Models.Data;
namespace Test
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
...
services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("database"), b => b.MigrationsAssembly("Test")));
services.AddIdentity<User, Role>()
.AddEntityFrameworkStores<AppDbContext>()
.AddDefaultTokenProviders();
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAntiforgery antiforgery)
{
...
}
}
}
项目结构
我最终结合了这两条评论来实现为 Blazor WASM 应用程序修改的 Clean Architecture 结构。
添加一个核心项目,定义接口,以及实现基础设施接口(如数据库)的基础设施项目。然后服务器依赖于这 2 个项目,这是有道理的。
启动然后通过 DI 配置接口,使用核心或基础结构中的适当实现。