可以同时注入UnitOfWork和DbContext吗?

时间:2019-12-08 09:01:27

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

所以我使用的是 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>>();
  

是否可以同时在 stratup.cs 中进行注入和激活?

1 个答案:

答案 0 :(得分:2)

这两个注册似乎相关。

第一个

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<SomeContext>,请解析为UnitOfWork<SomeContext>

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

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