Domain driven design 如何在领域驱动设计中使用多态实体进行领域建模?

Domain driven design 如何在领域驱动设计中使用多态实体进行领域建模?,domain-driven-design,Domain Driven Design,我正在重建一个会计软件。此软件可以处理多种类型的交易,例如销售、库存补充和费用。我没有会计方面的背景,但我在网上学到了一些概念。我正试图根据以下原则对该领域进行建模: 日记账分录由多个记录组成,每个记录要么是借项,要么是贷项。在给定日记账分录中,这些记录的借方和贷方总额必须相等(平衡) 必须根据源文档创建日记账分录。没有任何理由,不能简单地创建日记账分录 根据这些,我得出结论,必须有这些实体在场: JournalEntry实体,它有许多JournalEntry值对象。该实体负责保持其所有条目处于

我正在重建一个会计软件。此软件可以处理多种类型的交易,例如销售、库存补充和费用。我没有会计方面的背景,但我在网上学到了一些概念。我正试图根据以下原则对该领域进行建模:

  • 日记账分录由多个记录组成,每个记录要么是借项,要么是贷项。在给定日记账分录中,这些记录的借方和贷方总额必须相等(平衡)
  • 必须根据源文档创建日记账分录。没有任何理由,不能简单地创建日记账分录
  • 根据这些,我得出结论,必须有这些实体在场:

  • JournalEntry
    实体,它有许多
    JournalEntry
    值对象。该实体负责保持其所有条目处于平衡状态
  • SourceDocument
    实体,其中包含一些正在进行的交易的信息
  • JournalEntity
    SourceDocument
    都是聚合根,其中
    JournalEntity
    引用了
    SourceDocument
    标识

    现在问题来了。作为日记账分录创建基础的源文档可以是具有不同行为的不同内容。例如,“费用”来源单据可以由一对费用类别和费用金额的列表组成,“销售”来源单据可以由相关存货、每个存货的金额和每个存货每单位的价格组成

    这让我想到了模型中的另一种方法:

  • 创建一个抽象的
    SourceDocument
    类,该类具有创建日期和标识属性等共享属性
  • 创建
    SalesSourceDocument
    ExpenseSourceDocument
    等,它们是从摘要
    SourceDocument
  • JournalEntry
    实体仍必须引用
    SourceDocument
    标识
  • 虽然这是有道理的,但我不认为这是在DDD中建模问题的最佳方法,特别是因为它需要有一个抽象实体

    从我在线阅读的关于DDD的资料来看,当遇到这样的问题时,我需要一个抽象实体,我需要将它划分为不同的有界上下文。但是,我不确定是否可以这样做,因为
    SourceDocument
    标识可能会在“sales”上下文中返回具体的
    SalesSourceDocument
    ,但在“expense”上下文中也可能不返回任何内容

    解决这个问题的最佳方法是什么

    解决这个问题的最佳方法是什么

    将单独的用例视为单独的,直到发现需要调整它们的领域关注点

    您的销售文档和费用文档是不同的东西,您的数据模型应该反映:与它们相关联的信息存储在不同的表中;这些表的模式随着它们所管理的域的特定更改而变化

    复制比错误的抽象要便宜得多——Sandi Metz

    解决这个问题的最佳方法是什么

    将单独的用例视为单独的,直到发现需要调整它们的领域关注点

    您的销售文档和费用文档是不同的东西,您的数据模型应该反映:与它们相关联的信息存储在不同的表中;这些表的模式随着它们所管理的域的特定更改而变化

    复制比错误的抽象要便宜得多——Sandi Metz


    我认为这里要认识到的重要一点是,源文档术语是从
    日志
    的角度来描述日志条目文档之间的关系。文档是它们自己的AR,在没有日志的情况下很可能存在,那么为什么它们的抽象应该以与另一个AR的关系命名呢

    源文档很可能是描述与日记账分录相关的文档的必要术语,它也可能是模型的一部分,但可能是以值对象的形式,例如
    源文档{id,type}

    这并不意味着如果有用的话,就不能有一个
    文档
    抽象:当多态性有用时,没有理由不惜一切代价避免它

    我的分析可能是错误的(不管怎样,所有的模型都是错误的),但我只是想给你们一个不同的视角来看待这个特定的建模方面

    我正在重建一个会计软件。这个软件可以处理许多问题 交易类型,例如销售、库存补充和费用。我 我没有会计方面的背景,但我在网上学到了一些概念

    如果你可以在线了解你的整个领域,那么很可能它是一个通用的子域,在这个子域中最有可能买到现成的产品。你应该让领域专家参与进来,而不是上网尝试自己提出一个模型:也许你的整个愿景都错了


    此外,鉴于源文档很可能存在于不同的环境中,似乎会计上下文可以作为一个支持BC,它没有明确的知识或对其他BC的依赖性。

    我认为重要的是要认识到,源文档术语是用来描述日记账分录与文档,从
    杂志的角度。文档是它们自己的AR,在没有日志的情况下很可能存在,那么为什么它们的抽象应该是n
    
    public class CustomerDiscount
    {
        public int Type { get; }
        public decimal MinimumSpend { get; }
        public int Period { get; }
        public decimal DiscountPercent { get; }
    }