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