加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 工作单元,存储库,注入,使用块

发布时间:2020-12-16 09:53:59 所属栏目:asp.Net 来源:网络整理
导读:介绍 在阅读了多篇关于如何实现工作单元并牢记可测试性(单元测试)的文章之后,我可以在以下部分内容中看到以下内容: 接口:IRepository,IUnitOfWork. IRepository可以(可能是)像IRepository TEntity这样的泛型. IRepository和IUnitOfWork之间存在耦合.在某些
介绍

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

>接口:IRepository,IUnitOfWork. IRepository可以(可能是)像IRepository< TEntity>这样的泛型.
> IRepository和IUnitOfWork之间存在耦合.在某些示例中,您可以在IUnitOfWork上看到IRepository中的依赖项.您还会在具体的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();的操作.
>我们(ex:Ninject)可以依赖DI容器来处理每个Web请求(MVC)的处理吗?如果是,我们如何做(Ninject)并且它是一种设计POV的有效方法?
>您是否认为一个工作单元可以访问域中的所有存储库(如果UnitOfWork公开了存储库),那么我们只有一个具体的IUnitOfWork实现?
>将IUnitOfWork保持为仅包含Save()方法签名或使其包含IRepository属性或者可能是通用方法签名(如IRepository GetRepository< TEntity>();)更好吗?

参考

> http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
> Decouple unit of work from services or repo
> https://codereview.stackexchange.com/questions/31822/unit-of-work-and-repository-design-pattern-implementation/31833#31833?newreg=c38ed8eac7b549728ae8f82b965fff09

解决方法

创建一个通过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正在谈论一次性物品

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读