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
标识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; }
}