Domain driven design DDD中的存储库或ServiceAgent

Domain driven design DDD中的存储库或ServiceAgent,domain-driven-design,ddd-repositories,dddd,Domain Driven Design,Ddd Repositories,Dddd,我有一个使用存储库与数据库对话的系统。当它是远程服务时,正确的定义是什么?或者更好 存储库用于数据库,[…]用于外部Web服务 我在很多地方找到了关于ServiceAgent的信息,但我不知道这是否是正确的定义。不确定这是否是官方术语,但我将其称为“服务代理”.我只是想了解一下DDD的大部分原理,但我的理解是,存储库通常用于抽象数据库,但它们可以用来包装任何表现为持久和/或可查询存储的东西。因此,简而言之,我想我的建议是,如果您的服务的行为足够像数据库,那么我认为使用存储库抽象访问它所处理的实体

我有一个使用存储库与数据库对话的系统。当它是远程服务时,正确的定义是什么?或者更好

存储库用于数据库,[…]用于外部Web服务


我在很多地方找到了关于ServiceAgent的信息,但我不知道这是否是正确的定义。

不确定这是否是官方术语,但我将其称为“服务代理”.

我只是想了解一下DDD的大部分原理,但我的理解是,存储库通常用于抽象数据库,但它们可以用来包装任何表现为持久和/或可查询存储的东西。因此,简而言之,我想我的建议是,如果您的服务的行为足够像数据库,那么我认为使用存储库抽象访问它所处理的实体不会有任何问题

否则,如果web服务不直接处理域中的数据或行为,那么您的案例可能是应用程序层中基础结构级别服务的候选


如果有人有任何异议,请发表评论,因为我想知道我自己是否误解了存储库的预期用途。

在DDD中,存储库代表实体的虚拟集合(特别是聚合根)。因此,如果您有1000万个持久化客户,您将使用存储库,就像它是内存中所有1000万个客户的集合一样。存储库通常只处理在集合中可以找到的相同类型的操作:添加、删除、在集合中查找

如果数据的实际持久性是通过Web服务实现的,那么存储库的实现可能会与Web服务代理交互,而不是与数据库交互。然而,持久性涉及web服务这一事实并不能驱动域如何表达它。也就是说,数据是通过直接数据库调用、ORM、Web服务还是信鸽来持久化是一个实现细节


现在,如果您的域模型有依赖项需要外部服务(例如信用卡验证、地址验证等)来促进,则应以接口的形式将其表示为域服务,该接口根据域模型定义所需的操作。要明确的是,域服务是逻辑上属于域的操作,但由于某种原因不能完全适合给定实体或值对象。外部服务促进的行为只是您可能使用域服务的一个示例,因此不要将域服务视为“Web服务的存储库模式”或诸如此类的东西。

Hm,对我来说,服务代理意味着svcutil生成的一切。如果你需要额外的行为怎么办?大多数人创建的包装器调用生成的代理类,但添加了验证、缓存和异常处理。(这是我要找的术语)也许在网络世界。。。大声思考;我会通过服务代理使用存储库(因为它的数据存储独立)来访问web服务。