接口隔离,在“组合”存储库模式之上使用它是否有效?
接口隔离,在“组合”存储库模式之上使用它是否有效?
我正在使用Entity Framework作为我的ORM,并且使用一个“存储库的存储库”来抽象EF,以便我可以进行模拟等测试。
一个单一的存储库。
public interface IRepository: IView { IQueryable GetAll(); void Update( T entity ); void Delete( T entity ); void Add(T entity); T Default(); }
存储库的存储库;)
public interface IRepoOfRepos { IRepositoryTable_as { get; } IRepository Table_bs { get; } IRepository Table_cs { get; } }
等等等等
在我们的应用程序中,我们有一系列执行离散业务逻辑的“模块”,我计划将“IRepoOfRepos”“注入”到每个模块中。
然而,另一位团队成员建议我们应该真正创建一个额外的层(接口),其中只包含每个模块所需的数据访问方法(即SOLID中的“I”)。
我们有相当多的模块(30+),这似乎对于我认为可能不适用于数据访问层的原则来说是相当多余的工作,而且真正针对的是业务层?
非常感谢您的想法和提前感谢!
在这篇文章中,作者讨论了“composite”存储库模式的存在问题以及解决方法。作者指出,“composite”存储库模式并不存在,存储库不知道其他存储库的存在。如果需要使用多个存储库,应将所有相关接口作为参数注入到使用它们的服务中。
作者强调,存储库接口仅仅是为特定有界上下文的需求定义的。如果有30个模块,那么可以定义一个通用的接口定义(因为它是一个抽象,所以没有紧密耦合)。然后为每个模块的需求定义其他特定的接口。每个模块的服务(不论是哪个模块)只会使用所需的抽象。
在测试时,将测试业务服务的行为,使用存储库的伪装/模拟。ORM是不相关的,因为存储库接口只知道业务对象,而且从不告诉存储库如何完成其工作。
总之,是的,接口隔离是有效的使用方法,但不要使用存储库的存储库。
Interface Segregation, is it valid to use this on top of the 'composite' repository pattern?
在这些内容中,有一个问题需要回答:'复合'存储库模式是否可以使用接口隔离?
问题的出现原因:
- 有人建议只实现当前需要的查询,而不是在每个表上使用所有的CRUD方法。
- 数据访问层只提供了IRepository
- 为了在单元测试中使用虚拟数据,需要添加一个进一步的存储库层。
解决方法:
- 在设计存储库时要非常务实。
- 考虑为什么要创建IRepository
- 根据设计偏好选择更少的代码,并对每个操作有一个很好的理由。
- 如果需要在单元测试中使用虚拟数据,可以添加一个进一步的存储库层。
背景:
- 问题的提出者是一个承包商,正在与一家离岸外包软件公司合作。
- 软件公司只进行全面的端到端测试,并使用真实数据库。
- 创建测试数据需要一周以上的时间。
- 问题的提出者可以在几天内完成模块的编码和单元测试。
以上是关于'复合'存储库模式和接口隔离的讨论,根据讨论内容,可以得出以下结论:在设计存储库时要非常务实,只实现当前需要的查询。为了在单元测试中使用虚拟数据,可以添加一个进一步的存储库层。但要注意,在多个表之间存在键/依赖关系的复杂操作中,模拟/单元测试会变得更加困难。