如何使用工作单位实例化依赖注入



我正在寻求在我的ASP.NET Core 2.0应用程序中使用工作单位的存储库模式。使用.NET核心中使用的依赖项注入(DI)原理,进行此操作的示例不多。我试图重写文档中找到的示例。我还尝试添加异步操作。

现在的想法是,工作单位将其自己的dbcontext传递给了正在使用的每个实体的通用式词。然后,即使您在两个实体上工作,也要确保您使用一个dbcontext。

在我的控制器中,我获取一些这样的数据:

var model = new IndexViewModel
{
      Companies = await _unitOfWork.CompanyRepository.GetAsync()          
};

在我的工作单位中,正在使用di创建dbcontext。然后,它为每个实体创建了通用词的新实例,而它通过它的dbcontext传递到通用式的condoctor:

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

,但我担心依赖性注入会自动创建一个新的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
}

我担心这实际上会创建两个上下文。每个一个(如果提出两个请求)?因此,实际上,dbcontext将是三次实例化的,一个在单位工程中,然后每个存储库一个?这是GitHub上应用程序的链接。它在起作用,但我想了解这是如何工作的。感谢您的任何答案!

这一切都取决于您如何注册DbContext和使用哪个寿命。

.AddDbContext的默认过载将始终以示波器寿命注册DbContext。这意味着它将根据请求创建一个实例。

如果您将其制作 transient ,它将创建一个实例,并且每个应用程序lifetime

在大多数情况下应该是正确的。

但是,如果您的寿命高于其依赖性(即单身人士并注入范围的服务),则以上不是正确的,并且在设计和进行注册并进行注册时必须小心考虑到这一点。

最新更新