【问题标题】:Unit of Work, Repository, Injection, using block工作单元,存储库,注入,使用块
【发布时间】:2014-01-25 14:33:29
【问题描述】:

简介

在阅读了多篇关于如何实现工作单元并牢记可测试性(单元测试)的文章后,我可以在阅读的一些内容中看到以下内容:

  • 接口:IRepository、IUnitOfWork。 IRepository 可以(可能是)像IRepository<TEntity> 这样的泛型。
  • IRepository 和 IUnitOfWork 之间存在耦合。在某些示例中,您可以在 IRepository 中看到 IUnitOfWork 的依赖关系。您还会看到,一个具体的 UnitOfWork 中有多个 IRepository 属性
  • 在接近结尾的多个示例中,您可以看到这样的用法示例:

    using(var uow = new UnitOfWork()) {
    //some work here, maybe accessing member repositories in uow like:
    //var item = uow.Repository1.GetById(1);
    //item.SomeModifyingOperation();
    uow.Save();
    }
    

问题/意见

  • 这样的用法可以测试吗?它显然依赖于 UnitOfWork 的具体实现。
  • 我们的单元测试是否预计不会涵盖此类示例?
  • 如果要对其进行测试,那么代码将如何更改?我们是否会像ctor(IUnitOfWork uow){this.uow = uow;} 这样在构造函数中注入工作单元,然后像这样使用它:this.uow.Save();?
  • 如果我们走那条路,那么我们就不能利用 using 语句和 uow 的自动处理。我们将手动执行uow.Dispose(); 之类的操作。
  • 我们能否(例如:Ninject)依赖 DI 容器来为我们处理每个 Web 请求 (MVC) 的处置?如果是,我们如何做到这一点(Ninject),它是否是设计 POV 的一种有效方法?
  • 您是否认为工作单元可以访问域中的所有存储库(如果 UnitOfWork 公开存储库),因此我们只有一个 IUnitOfWork 的具体实现?
  • 是让 IUnitOfWork 保持简单,只包含一个 Save() 方法签名,还是让它包含 IRepository 属性,或者可能是一个通用方法签名,如 IRepository GetRepository<TEntity>();?

参考文献

【问题讨论】:

  • 我会使用IRepository.Save<T> 而不是IRepository<T>.Save()。在您访问多个实体的情况下,为您省去创建多个存储库的麻烦。

标签: asp.net-mvc unit-testing ninject unit-of-work


【解决方案1】:

创建一个通过 DI 注入的 IUnitOfWorkFactory:

public interface IUnitOfWorkFactory
{
    IUnitOfWork Create();
}

public class UnitOfWorkFactory : IUnitOfWorkFactory
{
    public IUnitOfWork Create()
    {
        return new UnitOfWork();
    }
}

然后在你的消费者中注入 UnitOfWorkFactory:

public MyController(IUnitOfWorkFactory workFactory)
{
    this.workFactory = workFactory;
}

public ActionResult DoSomething()
{
    using(var uow = workFactory.Create())
    {
        //do work
    }
}

通过这种方式,您可以两全其美。你得到你的对象注入 - 有助于可测试性。并且您可以在需要时自动处置您的 UOW。

顺便说一句,这是来自the DI book 的示例,对于这些模式值得一读。

编辑:This chapter from DI book 正在谈论 Disposable 对象

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    相关资源
    最近更新 更多