gpt4 book ai didi

asp.net-mvc - 工作单元,存储库,注入(inject),使用 block

转载 作者:行者123 更新时间:2023-12-01 02:19:45 25 4
gpt4 key购买 nike

介绍

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

  • 接口(interface):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;} 这样在构造函数中注入(inject)工作单元吗?然后像这样使用它:this.uow.Save(); ?
  • 如果我们走那条路,那么我们就不能利用 using 语句和 uow 的自动处理。我们将手动执行 uow.Dispose(); 之类的操作.
  • 我们(例如: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 注入(inject)的 IUnitOfWorkFactory:

    public interface IUnitOfWorkFactory
    {
    IUnitOfWork Create();
    }

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

    然后在你的消费者中注入(inject) UnitOfWorkFactory:
    public MyController(IUnitOfWorkFactory workFactory)
    {
    this.workFactory = workFactory;
    }

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

    这样你就可以从两个世界中获得最好的。你得到你的对象注入(inject) - 有助于可测试性。您可以在需要时自动处置您的 UOW。

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

    编辑 : This chapter from DI book正在谈论一次性元素

    关于asp.net-mvc - 工作单元,存储库,注入(inject),使用 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21351832/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com