Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 角色特定存储库与特定存储库_Design Patterns_Domain Driven Design_Repository Pattern - Fatal编程技术网

Design patterns 角色特定存储库与特定存储库

Design patterns 角色特定存储库与特定存储库,design-patterns,domain-driven-design,repository-pattern,Design Patterns,Domain Driven Design,Repository Pattern,我不知道特定于角色的存储库,直到我发现: 而不是公开 sun,我们也可以应用接口隔离原则 用于基于角色的接口,并定义仅公开 一个班级需要 public interface IProductRepositoryForNewOrder { Product[] FindDiscontinuedProducts(); } 单个存储库实现实现了所有产品存储库 接口,但只公开和使用所需的单个方法 打电话的人 a) 两者之间的区别在于,对于特定的存储库,我们每个聚合根有一个特定的契约,而角色特定的存

我不知道特定于角色的存储库,直到我发现:

而不是公开 sun,我们也可以应用接口隔离原则 用于基于角色的接口,并定义仅公开 一个班级需要

public interface IProductRepositoryForNewOrder
{
    Product[] FindDiscontinuedProducts();
}
单个存储库实现实现了所有产品存储库 接口,但只公开和使用所需的单个方法 打电话的人

a) 两者之间的区别在于,对于特定的存储库,我们每个聚合根有一个特定的契约,而角色特定的存储库,我们每个聚合根可以有几个契约,每个契约都是根据在聚合根上操作的特定调用方的需要定制的

b) 在你看来,这两种模式各有哪些优点和缺点

多谢各位

更新:

昨天,我找到了一个您认为应该使用特定于角色的存储库模式的地方:

“另一种选择是使用lambda而不是OrdersSelectorService。 如果lambda在您的语言中不可用,那么它应该是 传递OrderRepository的好处基于 接口隔离原则,其目标是减少 不必要的耦合。一个行为不太可能满足客户的需求 OrderRepository上的所有方法,而是需要一个特定的 函数,所以要明确。”

为什么在上面的摘录中,您提倡使用特定于角色的存储库模式,但在这里,您似乎建议仅在特殊情况下使用它。另一个主题中的例子是否是一种特殊情况(暂且不谈——我并不是说你在自相矛盾,我只是不明白这两个例子在使用或不使用特定角色模式方面有什么不同)?

a)是的。这是起作用的界面隔离原则;明确角色/用例。其好处是减少和“清理”依赖关系

b) 对我来说,角色特定方法的主要缺点是接口的增加以及由此导致的布线、引用等的增加。然而,这种缺点并不是由于原理上的缺陷,而是由于编程语言中的缺陷。在函数式语言中,例如F#,由于函数而不是接口的激增,接口隔离是默认的方法。从某种意义上说,函数是一种“更尖锐”的工具

非特定于角色的方法的优点是,它可以被视为定义数据访问契约的单个语言元素、接口或类。在某些情况下,从技术角度评估体系结构是很有价值的。

a)是的。这是起作用的界面隔离原则;明确角色/用例。其好处是减少和“清理”依赖关系

b) 对我来说,角色特定方法的主要缺点是接口的增加以及由此导致的布线、引用等的增加。然而,这种缺点并不是由于原理上的缺陷,而是由于编程语言中的缺陷。在函数式语言中,例如F#,由于函数而不是接口的激增,接口隔离是默认的方法。从某种意义上说,函数是一种“更尖锐”的工具


非特定于角色的方法的优点是,它可以被视为定义数据访问契约的单个语言元素、接口或类。在某些情况下,从技术角度评估体系结构是很有价值的。

我完全支持可靠的代码,但接口隔离原则确实有其局限性,特别是在DDD环境中

[挑剔者模式]

如果你将ISP应用到这封信中,你几乎可以从文章中获取关于存储库的声明,并对其稍作修改

使用域实体的类很少使用其中的每个方法

因此,对于每个域实体,您应该创建与实体的客户端数量相同的接口,在每个接口中只使用与客户端相关的方法,并使实体实现这些接口

当然,这是荒谬的,没有人会这样做。但是,嘿,ISP应该是一个通用的OO概念,不是吗

[/nitpicker模式]

现在,如果我们回顾一下ISP存在的最初原因,它应该反对胖接口,即那些没有内聚性的接口。但存储库本身难道不是内聚的吗?它不是一个基本的原子DDD构建块吗?它是否值得分割成几十个迷你查询对象?此外,我们领域中的每个类不都应该与无处不在的语言保持一致吗?像
ProductRepoInterfaceForcient1
ProductRepoInterfaceForcient2
ProductRepoInterfaceForcient3
这样的接口就很难做到这一点

别误会,ISP仍然很有用,尤其是作为一种检测接口契约是否比它应该的更异构的方法。Bob叔叔在ISP上的文章有很好的例子——参见“接口污染”一段和ATM示例


但是,一旦达到了合理的内聚水平,就不应该盲目地应用ISP,特别是当它与基本DDD原则相冲突,或者用成百上千的接口淹没您的代码库,这将成为维护的噩梦。

我完全支持可靠的代码,但接口隔离原则确实有其局限性,尤其是在DDD环境中

[挑剔者模式]

如果你将ISP应用到这封信中,你几乎可以从文章中获取关于存储库的声明,并对其稍作修改

使用域实体的类很少使用其中的每个方法

因此,对于每个域实体,您应该