【问题标题】:How dependency injection is instantiated using Unit of Work?如何使用工作单元实例化依赖注入?
【发布时间】:2018-02-11 18:22:49
【问题描述】:

我希望在我的 asp.net core 2.0 应用程序中使用工作单元实现存储库模式。使用 .net 核心中使用的依赖注入 (DI) 原则执行此操作的示例并不多。我试图重写文档中的this example。我还尝试在可能的情况下添加异步操作。

现在的想法是,工作单元将它自己的 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

但我担心每次使用 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
}

我担心这实际上会创建两个上下文。每个一个(如果有两个请求)?所以实际上 dbcontext 将被实例化 3 次,一次在 unitofwork 中,然后在每个存储库中实例化一次? Here is a link 到 github 上的应用程序。它正在工作,但我想了解它是如何工作的。感谢您的任何回答!

【问题讨论】:

    标签: c# asp.net-mvc entity-framework asp.net-core


    【解决方案1】:

    这完全取决于您如何注册 DbContext 以及您使用的生命周期。

    .AddDbContext 的默认重载将始终将DbContext 注册为具有作用域的生命周期。这意味着它将为每个请求创建一个实例。

    如果您将其设为transient,它将在每次解析时创建一个实例,并且在每个应用程序生命周期中singleton创建一个实例。

    在大多数情况下应该是这样。

    但是,如果您的服务具有比其依赖项更长的生命周期(即单例并注入作用域服务),则上述情况不正确,您在设计和注册时必须小心考虑到这一点。

    【讨论】:

    • 我的 dbcontext 是作用域的,同样是我发送 dbcontext 的工作单元。我想知道的是,当我从同一个工作单元类创建一个 genericrepository 实例并将其 dbcontext 传递给 genericrepository 构造函数时会发生什么?我假设通用存储库将使用相同的上下文而不是新的。但是由于通用存储库的构造函数需要一个 dbcontext,我担心 dbcontext 的依赖注入会覆盖它并创建一个新的。对不起,如果这弄乱了。感谢您的回答:)
    • 当您实例化通用存储库并传入 db 上下文(已注入您的 UoW)时,根本不涉及 IoC 容器。 IoC 不是编译器魔法,它发生在运行时,并且从不使用 new 关键字。只要你不new你的DbContext,就不会有不同的实例
    • 回想起来,我以为我已经为我的 GenericRepository 使用了一个接口并将其注册为 DI(我是在本地代码中完成的,而不是在 github 中)。因为我想知道如果创建了一个新类并且你传入它的构造函数会发生什么,该构造函数与设置为通过 DI 自动注入的类型相同(但它通常并不重要,但在这里重要的是上下文通过工作单元传递的是使用的类型)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多