首页 > 解决方案 > 部分初始化域实体

问题描述

在下文中,作者建议不要部分初始化域实体。

如前所述,每个客户的联系人不得超过 5 个。通过不与客户本身一起返回联系人,我们在域模型中留下了一个漏洞,允许我们添加第 6 个联系人,从而打破这个不变量。

因此,应该避免部分初始化的做法。如果您的存储库返回域实体列表(或仅返回单个域实体),请确保实体已完全初始化,这意味着它们的所有属性都已填写。 https://enterprisecraftsmanship.com/posts/partially-initialized-entities-anti-pattern/

那么,我们是否必须加载整个对象图?拥有所有联系人和所有相关事物或实体框架延迟加载的客户会有所帮助吗?

标签: entity-frameworkdomain-driven-design

解决方案


它可能与对象图关系不大,而与所涉及的不变量有关。

正如有人在该帖子的评论中发布的那样,当有 1000 个允许的联系人时,很可能会出现性能问题。这种效果的一个例子可能是 aCustomer可能只有 5 个活动Order实例。是否应该加载链接到客户的所有订单实例?绝对不是。事实上,anOrder是另一个聚合,一个聚合的实例不应包含在另一个聚合中。您可以使用包含另一个聚合的 id 的值对象,但是对于其中的许多相同的性能问题可能会表现出来。

另一种选择可能是简单地保持 aContactCount或在我的示例ActiveOrderCount中保持一致。如果要存储/删除实际关系,则可以在添加/删除时将这些关系附加到相关聚合以保持更改,但这是暂时的表示。

那么,我们是否必须加载整个对象图?拥有所有联系人和所有相关事物或实体框架延迟加载的客户会有所帮助吗?

实际上,答案是响亮的“是”。但是,您的对象模型不应该很深。您应该尽一切努力创建小型聚合。我尝试使用单个根实体对聚合建模,然后包含值对象。加载整个聚合。延迟加载可能表明您正在查询您的域,我建议您要这样做。而是创建一个简单的查询机制,该机制使用一些读取模型为您的前端返回相关数据。


推荐阅读