【问题标题】:Repository or ServiceAgent in DDDDDD 中的存储库或 ServiceAgent
【发布时间】:2011-06-24 22:40:52
【问题描述】:

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

存储库用于数据库,因为 [...] 用于外部 Web 服务。

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

【问题讨论】:

    标签: domain-driven-design ddd-repositories dddd


    【解决方案1】:

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

    【讨论】:

    • 嗯,对我来说,Service Proxy 意味着所有由 svcutil 生成的东西。如果您需要其他行为怎么办?大多数人创建包装器来调用生成的代理类,但增加了验证、缓存、异常处理。 (这就是我要找的词)
    • 也许在 dotNet 世界中......大声思考;我会通过服务代理使用存储库(因为它的数据存储独立)来访问网络服务。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      在 DDD 中,存储库表示实体的虚拟集合(特别是聚合根)。因此,如果您有 10M 的持久客户,您将使用存储库就好像它是内存中所有 10M 的集合。存储库通常只处理与集合相同类型的操作:添加内容、删除内容、在集合中查找内容。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-17
        相关资源
        最近更新 更多