【问题标题】:DotNet Core Dependency Injection Multiple ProjectsDotNet Core 依赖注入多个项目
【发布时间】:2020-11-09 00:15:11
【问题描述】:

我正在构建 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 项目来实现它所需的接口,但是我不知道如何在 start.cs 文件中配置依赖项App.Server 项目,因为它不能依赖于 App.Data 项目。

【问题讨论】:

  • 通常你会把你的接口放在一个领域层,比如 App.Domain。 App.Data 将依赖于 App.Domain,而 App.Server 也将依赖于 App.Domain。然后,您的 app.server 还可以引用 app.Data 以便您进行注册(这没关系)。或者您可以使用反射作为注册服务的一种方式,而无需 App.Server 引用 App.Data。
  • 值得一提的是,App.Domain 不会依赖任何东西。所有依赖项都会指向内部。
  • 我喜欢这个Onion View

标签: asp.net-core dependency-injection shared-libraries blazor


【解决方案1】:

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)
        {
            ...
        }
    }
}

项目结构

【讨论】:

    【解决方案2】:

    我最终将这两个 cmets 组合在一起,以实现为 Blazor WASM 应用程序修改的 Clean Architecture 结构。

    添加一个核心项目,定义接口,以及实现基础设施接口(如数据库)的基础设施项目。然后服务器依赖于这两个项目,这是有道理的。

    Startup 然后通过 DI 配置接口,使用 Core 或 Infrastructure 中的适当实现。

    【讨论】:

      猜你喜欢
      • 2017-07-23
      • 2020-12-20
      • 2020-08-18
      • 2020-11-30
      • 1970-01-01
      • 2021-08-25
      • 2022-07-15
      • 2017-07-14
      • 1970-01-01
      相关资源
      最近更新 更多