gpt4 book ai didi

domain-driven-design - 我们都在寻找相同的 IRepository 吗?

转载 作者:行者123 更新时间:2023-12-04 02:09:01 27 4
gpt4 key购买 nike

我一直在尝试想出一种方法来编写适用于各种数据存储的通用存储库:

public interface IRepository
{
IQueryable<T> GetAll<T>();
void Save<T>(T item);
void Delete<T>(T item);
}
public class MemoryRepository : IRepository {...}
public class SqlRepository : IRepository {...}

我想针对每个中的相同 POCO 域类工作。我也在考虑一种类似的方法,每个域类都有自己的存储库:
public interface IRepository<T>
{
IQueryable<T> GetAll();
void Save(T item);
void Delete(T item);
}
public class MemoryCustomerRepository : IRepository {...}
public class SqlCustomerRepository : IRepository {...}

我的问题:1)第一种方法是否可行? 2)第二种方法有什么优势吗?

最佳答案

  • 第一种方法是可行的,我过去在编写自己的针对 RDBMS 和 XmlWriter 的映射框架时做过类似的事情。/XmlReader .您可以使用这种方法来简化单元测试,尽管我认为现在我们拥有出色的 OSS 工具可以做到这一点。
  • 第二种方法是我现在使用的 IBATIS.NET mappers .每个映射器都有一个接口(interface),每个映射器 [可以] 提供您的基本 CRUD 操作。优点是域类的每个映射器还具有由接口(interface)表示并在具体映射器中定义的特定功能(例如 SelectByLastNameDeleteFromParent )。因此,我不需要像您建议的那样实现单独的存储库 - 我们的具体映射器以数据库为目标。为了执行单元测试,我使用 StructureMapMoq创建内存存储库,作为您的 Memory*Repository做。对于一个非常可测试的方法,它的实现和管理类更少,整体工作更少。对于跨单元测试共享的数据,我为每个具有 WithXXX 的域类使用构建器模式。方法和AsSomeProfile方法(AsSomeProfile 只返回一个带有预配置测试数据的构建器实例)。

  • 这是我通常在单元测试中最终得到的示例:
    // Moq mocking the concrete PersonMapper through the IPersonMapper interface
    var personMock = new Mock<IPersonMapper>(MockBehavior.Strict);
    personMock.Expect(pm => pm.Select(It.IsAny<int>())).Returns(
    new PersonBuilder().AsMike().Build()
    );

    // StructureMap's ObjectFactory
    ObjectFactory.Inject(personMock.Object);

    // now anywhere in my actual code where an IPersonMapper instance is requested from
    // ObjectFactory, Moq will satisfy the requirement and return a Person instance
    // set with the PersonBuilder's Mike profile unit test data

    关于domain-driven-design - 我们都在寻找相同的 IRepository 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/270845/

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