工作单位,存储库,注入,使用块



into

在阅读了有关如何实现工作单位并保持心灵测试(单位测试)的多篇文章之后,我可以在我阅读的某些内容中看到以下内容:

  • 接口:iRepository,iunitofwork。iRepository可以(可能是)像IRepository<TEntity>这样的通用。
  • iRepository和iunitofwork之间存在一个耦合。在某些示例中,您可以看到Irpository对Iunitofwork的依赖性。您还会看到,混凝土单元中的多个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();
    }
    

问题/观察

  • 这样的用法可以测试吗?显然,这取决于单位工程的具体实现。
  • 这样的示例是我们的单位测试所期望的吗?
  • 如果要测试,那么代码将如何更改?我们会在 ctor(IUnitOfWork uow){this.uow = uow;}之类的构造函数中注入工作单元,然后这样使用: this.uow.Save();
  • 如果我们走那条路径,那么我们将无法使用使用语句和自动处置UOW。我们会手动做类似uow.Dispose();的事情。
  • 我们(ex:ninject)是否可以依靠DI容器来处理每个Web请求(MVC)的处置?如果是,我们该怎么做(ninject),这是设计pov的有效方法吗?
  • 您是否会考虑一个工作单位将访问域中的所有存储库(如果单位工程汇总存储库),因此我们只有一个具体的Iunitofwork实施?
  • 使Iunitofwork保持简单,例如仅包含一个save()方法签名,或者它包含iRepository属性,或者也许是一个通用方法签名,例如IRepository GetRepository<TEntity>();

参考

  • http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-isus-mvc-4/implementing-the-reposository-the-repository-and-unit--unit--unit-of-work-ports-in-in-AS-ASP-NET-MVC-APPLICATION
  • 服务或repo的工作单位
  • https://codereview.stackexchange.com/questions/31822/31822/unit-er-work-work--repositority-design-pattern-implementation/3183343343331833?

创建通过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。

顺便说一句,这是值得阅读这些模式的DI书的示例。

编辑:DI书的本章正在谈论一次性对象

最新更新