【问题标题】:Is it ok to inject both UnitOfWork and DbContext itself?可以同时注入 UnitOfWork 和 DbContext 本身吗?
【发布时间】:2019-12-08 09:01:27
【问题描述】:

我正在使用 UnitOfWork 模式,它运行良好 但因为我需要使用 UserManager 和 SinginManager 我也必须将此部分添加到 startup.cs

        services.AddDbContext<MainDbContext>(p => p.UseSqlServer(
            @"Data Source="));

但由于我使用的是 UnitOfWork 我也添加了这些行;

            services.AddScoped<IUnitOfWork<MainDbContext>, UnitOfWork<MainDbContext>>();
        services.AddScoped<IUnitOfWork<FinancialDbContext>, UnitOfWork<FinancialDbContext>>();

startup.cs 中注入和激活两种方式都可以吗?

【问题讨论】:

    标签: c# asp.net-core asp.net-web-api dependency-injection unit-of-work


    【解决方案1】:

    这两个注册似乎是相关的。

    第一个

    services.AddDbContext<MainDbContext>(p => p.UseSqlServer(@"Data Source=Main...."));
    

    让容器知道如何在请求时自行解析上下文,

    而第二个注册最有可能依赖于上下文的类型

    services.AddScoped<IUnitOfWork<MainDbContext>, UnitOfWork<MainDbContext>>();
    services.AddScoped<IUnitOfWork<FinancialDbContext>, UnitOfWork<FinancialDbContext>>();
    

    上面也可以使用开放泛型来简化

    services.AddScoped(typeof(IUnitOfWork<>), typeof(UnitOfWork<>));
    

    告诉容器

    “当IUnitOfWork&lt;SomeContext&gt; 被请求时,解析为UnitOfWork&lt;SomeContext&gt;

    因此,如果您需要使用不同上下文的单元,也没有错

    services.AddDbContext<MainDbContext>(p => p.UseSqlServer(@"Data Source=Main....")); 
    services.AddDbContext<FinancialDbContext>(p => p.UseSqlServer(@"Data Source=Financial...."));
    services.AddScoped(typeof(IUnitOfWork<>), typeof(UnitOfWork<>));
    

    除此之外,请注意实体框架已经围绕工作单元/存储库模式设计,分别具有DbContextDbSet

    【讨论】:

    • 所以两者都可以使用吗?根据您的回答,我应该同时添加两者吗?像这样? services.AddDbContext(p => p.UseSqlServer(@"Data Source=Main....")); services.AddDbContext(p => p.UseSqlServer(@"Data Source=Financial...."));
    • @keyone2693 如果您需要使用不同上下文的单元,这并没有错
    • 那么你的意思是什么?除此之外,请注意实体框架已经围绕工作单元/存储库模式设计,分别具有其 DbContext 和 DbSet。
    • @keyone2693 有时有人认为您使用的设计是多余的,因为 EF 已经遵循 UoW 模式。我只是想引起你的注意。我个人和你做的一样。
    • 我要明确地说在 EF 周围使用 UoW/repository 模式是错误的。除了抽象 EF 之外,我还没有听到任何好的论据。但是,1) 无论如何,它并没有做好这方面的工作,并且 2) 有更合适的模式:CQRS、微服务、服务层等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多