C# 如何使用工作单元实例化依赖项注入?

C# 如何使用工作单元实例化依赖项注入?,c#,asp.net-mvc,entity-framework,asp.net-core,C#,Asp.net Mvc,Entity Framework,Asp.net Core,我希望在我的asp.net core 2.0应用程序中使用工作单元实现存储库模式。使用.NETCore中使用的依赖项注入(DI)原则实现这一点的例子并不多。我试图重写在文档中找到的内容。我还尝试在可能的地方添加异步操作 现在的想法是,工作单元将其自己的dbcontext传递给正在使用的每个实体的GenericRepository。这样可以确保即使处理两个实体,也只使用一个dbcontext 在我的控制器中,我获取如下数据: var model = new IndexViewModel {

我希望在我的asp.net core 2.0应用程序中使用工作单元实现存储库模式。使用.NETCore中使用的依赖项注入(DI)原则实现这一点的例子并不多。我试图重写在文档中找到的内容。我还尝试在可能的地方添加异步操作

现在的想法是,工作单元将其自己的dbcontext传递给正在使用的每个实体的GenericRepository。这样可以确保即使处理两个实体,也只使用一个dbcontext

在我的控制器中,我获取如下数据:

var model = new IndexViewModel
{
      Companies = await _unitOfWork.CompanyRepository.GetAsync()          
};
在我的工作单元中,dbcontext是使用DI创建的。然后,它为每个实体创建GenericRepository的新实例,同时将其dbcontext传递给GenericRepository的构造函数:

private ApplicationDbContext _context;
private GenericRepository<Company> companyRepository;
private GenericRepository<Person> personRepository;        

public UnitOfWork(ApplicationDbContext context)
{
    _context = context;
}

public GenericRepository<Company> CompanyRepository
{
    get
    {
        if (this.companyRepository == null)
        {
            this.companyRepository = new GenericRepository<Company>(_context);
        }
        return companyRepository;
    }
}

//repeat for Person
private ApplicationDbContext\u上下文;
私人总储蓄公司储蓄;
私人通用存储库;
公共工作单元(ApplicationDbContext上下文)
{
_上下文=上下文;
}
公共总储蓄公司储蓄
{
得到
{
if(this.companyRepository==null)
{
this.companyRepository=新的通用repository(_context);
}
返回公司地址;
}
}
//为某人重复
但我担心每次使用GenericRepository时,依赖注入都会自动创建一个新的dbcontext

public class GenericRepository<TEntity> where TEntity : class
{
    internal ApplicationDbContext _context;
    internal DbSet<TEntity> dbSet;

    public GenericRepository(ApplicationDbContext context)
    {
        _context = context;
        dbSet = context.Set<TEntity>();
    }
     //...other methods
}
公共类通用存储,其中tenty:class
{
内部应用程序bContext\u上下文;
内部数据库集;
公共通用存储库(ApplicationDbContext上下文)
{
_上下文=上下文;
dbSet=context.Set();
}
//…其他方法
}

我担心这实际上会造成两种情况。每个人一个(如果提出两个请求)?所以在现实中,dbcontext将被实例化三次,一次在unitofwork中,然后一次用于每个存储库?到github上的应用程序。它是有效的,但我想了解它是如何工作的。谢谢你的回答

这一切都取决于你如何注册你的
DbContext
以及你使用的生命周期

默认重载
.AddDbContext
将始终使用作用域生存时间注册
DbContext
。这意味着,它将为每个请求创建一个实例

如果将其设置为“瞬态”,则每个解析将创建一个实例,每个应用程序生存期将创建一个实例

大多数情况下都是这样


但是,如果您有一个具有更高生存期的服务,那么它是依赖项(即单例和注入作用域服务),那么上述情况就不正确了,在设计和注册时,你必须小心,并将其考虑在内。

这一切都取决于你如何注册你的
DbContext
以及你使用的生命周期

默认重载
.AddDbContext
将始终使用作用域生存时间注册
DbContext
。这意味着,它将为每个请求创建一个实例

如果将其设置为“瞬态”,则每个解析将创建一个实例,每个应用程序生存期将创建一个实例

大多数情况下都是这样


但是,如果您有一个具有更高生存期的服务,那么它是依赖项(即单例和注入作用域服务),那么上述情况就不是真的,您在设计和注册时必须小心,并考虑到这一点。

My dbcontext是作用域的,dbcontext发送到的unitofwork也是如此。我想知道的是,当我从同一个unitofwork类创建genericrepository实例并将其dbcontext传递给genericrepository构造函数时会发生什么?我假设genericrepository将使用相同的上下文,而不是新的上下文。但是由于genericrepository的构造函数采用dbcontext,我担心dbcontext的依赖注入会覆盖它并生成一个新的。如果这件事搞砸了,很抱歉。我很感激您的回答:)当您实例化通用存储库并在db上下文中传递(它被注入到您的UoW中)时,就根本不涉及IoC容器。IoC不是编译器的魔法,它发生在运行时,决不会使用
new
关键字。只要您不
new
您的
DbContext
,就不会有不同的ITI实例。在retrospect中,我以为我在GenericRepository中使用了一个接口,并为DI注册了它(我是在本地代码中注册的,而不是在github中注册的)。因为我想知道如果创建了一个新类,并且您将设置为通过DI自动注入的同一类型传递给它的构造函数,会发生什么情况(但通常情况下这并不重要,但这里重要的是工作单元传递的上下文就是所使用的类型),这也是我的unitofwork,其中dbcontext被发送到。我想知道的是,当我从同一个unitofwork类创建genericrepository实例并将其dbcontext传递给genericrepository构造函数时会发生什么?我假设genericrepository将使用相同的上下文,而不是新的上下文。但是由于genericrepository的构造函数采用dbcontext,我担心dbcontext的依赖注入会覆盖它并生成一个新的。如果这件事搞砸了,很抱歉。我很感激您的回答:)当您实例化通用存储库并在db上下文中传递(它被注入到您的UoW中)时,就根本不涉及IoC容器。IoC不是编译器的魔法,它发生在运行时,决不会使用
new
关键字。只要您不
new
您的
DbContext
,就不会有不同的ITI实例。在retrospect中,我以为我在GenericRepository中使用了一个接口,并为DI注册了它(我是在本地代码中注册的,而不是在github中注册的)。因为我想知道