Asp.net core DotNet核心依赖注入多个项目

Asp.net core DotNet核心依赖注入多个项目,asp.net-core,dependency-injection,shared-libraries,blazor,Asp.net Core,Dependency Injection,Shared Libraries,Blazor,我正在构建Blazor WASM应用程序 该应用程序正在运行,但我现在希望将该项目拆分为合理的自包含项目,但在解决如何实现依赖项注入而不在项目之间创建循环依赖项的问题时遇到了问题 Projects: App.Client - UI Razor Pages App.Server - Main project, controllers, defines interfaces App.Shared - Shared models between Client & Server App.Data

我正在构建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项目来实现它所需的接口,但是我不确定如何在App.Server项目的startup.cs文件中配置依赖项,因为这不能依赖于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)
        {
            ...
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Antiforgery;
使用Microsoft.AspNetCore.Builder;
使用Microsoft.AspNetCore.Hosting;
使用Microsoft.AspNetCore.Http;
使用Microsoft.AspNetCore.HttpsPolicy;
使用Microsoft.AspNetCore.Identity;
使用Microsoft.EntityFrameworkCore;
使用Microsoft.Extensions.Configuration;
使用Microsoft.Extensions.DependencyInjection;
使用Microsoft.Extensions.Hosting;
使用测试模型;
使用测试、模型、数据;
名称空间测试
{
公营创业
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
...

services.AddDbContextStartup.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)
        {
            ...
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Antiforgery;
使用Microsoft.AspNetCore.Builder;
使用Microsoft.AspNetCore.Hosting;
使用Microsoft.AspNetCore.Http;
使用Microsoft.AspNetCore.HttpsPolicy;
使用Microsoft.AspNetCore.Identity;
使用Microsoft.EntityFrameworkCore;
使用Microsoft.Extensions.Configuration;
使用Microsoft.Extensions.DependencyInjection;
使用Microsoft.Extensions.Hosting;
使用测试模型;
使用测试、模型、数据;
名称空间测试
{
公营创业
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
...

services.AddDbContext

我最终将这两个注释结合起来,实现了一个为Blazor WASM应用程序修改的干净的体系结构

添加一个核心项目,定义接口,以及实现基础设施接口(如database.Server)的基础设施项目,然后这两个项目之间就有了依赖关系,这是有意义的

然后,Startup通过DI配置接口,在核心或基础架构中使用适当的实现


最后,我将这两个注释结合起来,实现了一个为Blazor WASM应用程序修改的干净体系结构

添加一个核心项目,定义接口,以及实现基础设施接口(如database.Server)的基础设施项目,然后这两个项目之间就有了依赖关系,这是有意义的

然后,Startup通过DI配置接口,在核心或基础架构中使用适当的实现


通常,您会将接口放在域层中,因此App.domain.App.Data将取决于App.domain,App.Server也将取决于App.domain。然后,您的App.Server还可以引用App.Data,以便您进行注册(这是可以的)。或者,您可以使用反射作为注册服务的一种方式,而不使用App.Server引用App.Data。值得一提的是,App.Domain不会依赖任何东西。所有依赖项都会指向内部。我喜欢这样做。通常,您会将接口放在域层中,因此App.Domain.App.Data将依赖于App.Domain和App.Server还依赖于App.Domain。然后,您的App.server也可以引用App.Data,以便您进行注册(这是可以的)。或者,您可以使用反射作为注册服务的一种方式,而不使用App.Server引用App.Data。值得一提的是,App.Domain不依赖于任何内容。所有依赖项都指向内部。我喜欢这样做。