【问题标题】:How to set business logic that require data from DB in Domain Driven Design如何在领域驱动设计中设置需要来自数据库的数据的业务逻辑
【发布时间】:2015-04-18 03:07:52
【问题描述】:

我正在努力学习 DDD,请多多包涵。 假设我有一个名为问题的聚合。 它有一个 StatusId 属性。这种状态可以是ie。打开、关闭……它存储在一个名为 Statuses 的数据库表中。 (这是因为特定用户可以有特定的状态,所以我希望用户能够添加新的状态) 现在,我在问题聚合中创建了一个这样的方法: public static void SubmitIssue(Guid projectId, string issueTitle, string description...)

此方法使用请求创建新问题。参数,然后我需要将其设置为正确的状态。但是状态是在数据库中指定的。 当我在做业务逻辑时必须从数据库中获取数据时,如何处理这种情况? 请帮忙

【问题讨论】:

    标签: oop domain-driven-design data-access-layer rich-domain-model


    【解决方案1】:

    您的问题不仅仅是 DDD 问题。这真的是关于 OO 设计。 问题是您不想要一个会迫使您在所有地方做出决定的枚举。 - 用丑陋的 switch 和 if 语句乱扔代码。

    对此没有简单或准确的答案。

    我会尝试做什么:

    你有问题类(可以是不同的类型),这意味着你可以继承和实现基于该类型的具体。 不过很重要! 如果问题可以从一种类型更改为另一种类型,则对问题类的继承是错误的路线。在这种情况下,您需要将这些类型的逻辑差异(以及它们应用的业务规则)移到 IssueType 类中,并且您的 Issue 类必须使用相关的 IssueType 来构建。

    鲍勃叔叔有一个很好的例子,与他在书中讨论的问题非常相似:http://www.amazon.com/Software-Development-Principles-Patterns-Practices/dp/0135974445

    当然,他在示例中没有谈到 DB,但这就是 DDD 的重点。

    我有 PDF 版本,因此页面可能略有不同。 :第 454 到 456 页讨论了具体的用例。

    真的希望这会有所帮助。 - 几乎希望我在一个团队中与你一起工作并且能够解决它。

    【讨论】:

    • 您好,感谢您这么快回答。当然,我会有多种问题类型(错误、任务、障碍……),但这不是重点。不是重点,因为问题类型一旦设置就无法更改(它是不可变的)。我的问题是,解决业务问题,例如将问题的状态设置为 ie。打开或关闭或进行中...我需要往返数据库以获取其 StatusID,以便我可以设置它。在这种情况下,枚举是一个不错的方法,但随后用户将无法添加新状态。
    • 虽然,为了能够使用这些新状态,我仍然需要更改代码来实现处理这些新状态的逻辑,或者将整个工作流(状态)管理放在数据库中,这就是我不会的。
    • 你不需要额外的往返来获取状态,第一次加载你就可以得到它。 -有点 DDD 的意义,以确保您填充所需的聚合根及其数据,这样您就可以做出决策,而无需不必要地访问数据库。设置状态,是的,您最终将保留整个更改集,这将在数据库中设置 StatusId。我同意,您的逻辑是针对每个状态明确实施的。大多数票务系统(这听起来像 JIRA、Assembla 等跟踪系统)让您选择状态规则。 - 需要大量额外的编码 - 你不希望我收集这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2011-11-18
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多