Design patterns 使存储库持久化的优点/缺点是什么?

Design patterns 使存储库持久化的优点/缺点是什么?,design-patterns,domain-driven-design,repository-pattern,Design Patterns,Domain Driven Design,Repository Pattern,通常,存储库应该知道我们决定使用哪个数据库的实现细节 a) 但是,使存储库持久性无知(即不知道使用什么持久性介质来存储数据)的优点/缺点是什么。我能想到的唯一优点是,现在无论将数据持久化到哪个介质,都可以使用相同的存储库实现 b) 假设存储库被设置为不知道持久性,那么存储库接口及其实现都应该驻留在域程序集中 谢谢你这听起来有点像你自己在思考。经典的存储库模式旨在将持久性细节从价值对象和实体(DDD中的基本构建块)的实现中抽象出来。如果要隐藏持久性,那么让存储库持久性不被察觉会有什么好处呢 有些人

通常,存储库应该知道我们决定使用哪个数据库的实现细节

a) 但是,使存储库持久性无知(即不知道使用什么持久性介质来存储数据)的优点/缺点是什么。我能想到的唯一优点是,现在无论将数据持久化到哪个介质,都可以使用相同的存储库实现

b) 假设存储库被设置为不知道持久性,那么存储库接口及其实现都应该驻留在域程序集中


谢谢你

这听起来有点像你自己在思考。经典的存储库模式旨在将持久性细节从价值对象和实体(DDD中的基本构建块)的实现中抽象出来。如果要隐藏持久性,那么让存储库持久性不被察觉会有什么好处呢


有些人认为他们应该抽象掉持久性抽象的细节,例如,允许使用“通用ORM”而不是“NHibernate”,但在这里,我认为这对你自己来说太聪明了。你有一个
i假设
,这就足够了。如果您想要一个
NHibernateRepository
和一个
EventStoreRepository
,那就去吧。

好吧,使用Repository模式的关键是将域逻辑与持久性逻辑分开,因此,您可以对不同的数据存储使用相同的域实现。因此,存储库的实现在一定程度上依赖于数据库实现似乎是很自然的

a) 我认为主要的缺点是性能。存储库库越抽象,就需要设计和实现更多的抽象级别,涵盖更多的案例。但是,如果知道其底层存储的全部功能,那么专用存储库的性能会更好


另一个缺点是开发和维护成本。我认为这些缺点超过了拥有完全通用结构的任何优点

b) 对于较小的项目,我的答案是“可能”,但对于所有其他项目,我的答案是“不”。这与持续的无知无关。我一直尝试遵循的一个最佳实践是分离关注点。如果他们试图做不同的事情,那么把他们分开。这会让你以后从很多噩梦中解脱出来


任何进一步的想法|想法,我也愿意听到:)

与其让存储库“持久性无知”,不如将存储库接口与实现分离。例如,CustomerRepository可以由NHibernateCustomerRepository和EFCustomerRepository实现。这样,在实现之间切换就像更改配置一样简单(至少在幻想世界中是如此)。这在现实世界中有一些用途:例如,某些客户坚持使用专有解决方案。

我假设所涉及的代码较少,因为存储库通常位于数据映射器之上,数据映射器知道所使用的持久性介质。因此,当您有N个持久性介质时,您必须编写“N个存储库实现+N个数据映射器”,而如果存储库不知道持久性介质,我们只需编写“1个存储库+N个数据映射器”?还是我的推理有缺陷?在经典的DDD公式中,每个存储库都很容易编写——通常只是泛型类的具体实例。然后添加所需的查询,这是无论如何都要做的。很抱歉拖拽了这个1-因此,如果我理解正确的话,让存储库不知道持久性介质是没有意义的,主要是因为它只需要多一点努力/代码(与编写不知道持久性介质的存储库相比)要编写知道持久性介质的存储库?2-尽管我必须承认,我仍然不太明白让存储库不知道持久性介质的缺点是什么?!“另一个缺点是开发和维护成本。”为什么让存储库不知道持久性介质会增加开发和维护成本(我不认为让持久性介质不可知的存储库违反单一责任原则)?我的期望正好相反?!如果SRP位于不同的部件中,则不会中断SRP。然而,在(b)中,我认为是这样的。域逻辑程序集的用途不同于提供持久性不可知数据访问的抽象层。“另一个缺点是开发和维护成本。”在这一点上,我考虑了是否超出范围,使其过于通用(即支持大量媒体)。当然,如果您在项目范围内,这将降低成本。感谢您指出这一点,我必须更清楚地解释:)“如果它在不同的程序集中,它不会破坏SRP。”因此,即使我们使存储库持久性不可知,只有存储库接口可以驻留在域程序集中,但不能驻留在存储库实现中,否则我们会破坏SRP(或者更确切地说,我们破坏关注点分离规则)?是的,领域逻辑和持久不可知论库的兴趣仍然不同,最好将它们分开。