问题标签 [rich-domain-model]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2477 浏览

c# - 单元测试富域模型

这是贫血的域模型:

这是它的行为:

它几乎是可测试的:

但是,我想练习富域模型,其中数据和行为在逻辑上更具凝聚力。所以上面的代码现在转换为:

但是我遇到了测试问题:

单元测试错误:

看到直接从被模拟的对象调用方法,被模拟的对象就无法检测到是否调用了它的任何属性或方法。注意到这一点后,对富域模型进行单元测试的正确方法是什么?

0 投票
10 回答
50369 浏览

domain-model - 富域模型与贫血域模型

我正在决定是否应该使用富域模型而不是贫血域模型,并寻找两者的好例子。

我一直在使用贫血域模型构建 Web 应用程序,由服务 --> 存储库 --> 存储层系统支持,使用FluentValidation进行 BL 验证,并将我的所有 BL 放在服务层中。

我读过 Eric Evan 的 DDD 书,他(连同 Fowler 和其他人)似乎认为贫血域模型是一种反模式。

所以我真的很想深入了解这个问题。

此外,我真的在寻找富域模型的一些好的(基本)示例,以及它提供的贫血域模型的好处。

0 投票
1 回答
171 浏览

architecture - POCO can be used as domain model

We are planning to developing a software following Domain Driven Design inspiring by the Red (EE) and Blue (VV) ddd books. The business is not that complicated. It is possible to avoid inheritances for all concrete classes. The goal is to feel the importance of Domain Model. So is it OK to use POCO classes which will be inherited from Entity? Or It will be better to create the domain model and use DTO or repository to transfer values to domain model?

0 投票
1 回答
66 浏览

oop - 如何在领域驱动设计中设置需要来自数据库的数据的业务逻辑

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

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

0 投票
2 回答
2320 浏览

domain-driven-design - 领域驱动设计:如何处理具有大量数据字段的复杂模型?

好吧,我正在尝试为我的应用程序应用领域驱动设计原则,并使用包含数据字段和业务逻辑的丰富领域模型。我读过很多 DDD 书籍,但似乎它们的领域模型(称为实体)非常简单。当我有一个包含 10-15 个数据字段的域模型时,这会成为一个问题,如下所示:

如您所见,这个领域模型包含大量的数据字段,它们都很重要,不能被剥离。我知道一个好的富域模型不应该包含 setter 方法,而是将其数据传递给构造函数,并使用业务逻辑改变状态。但是,对于上述领域模型,我不能将所有内容都传递给构造函数,因为它会导致构造函数方法中的参数超过 15 个。一个方法不应该包含超过 6-7 个参数,你不觉得吗?

那么如何处理具有大量数据字段的域模型呢?我应该尝试分解它吗?如果是这样,怎么做?或者,我应该只使用 Builder 类或反射在实例化时初始化其属性,这样我就不会用这么多参数污染构造函数?谁能给点建议?谢谢。

0 投票
1 回答
84 浏览

c# - Unity Of Work + 富域

我正在尝试使用 Unit of Work 实现丰富的模型。

构建运行正常,但在此类中,工作单元为空。

我确实有这个类的接口。

在 UnityConfig.cs 中,我注册了类型

为什么工作单元没有被初始化,我该如何解决这个问题?

0 投票
1 回答
66 浏览

javascript - 富域模型和表单映射

TLDR:如何将富域模型与“重型”设置器与简单的 HTML 表单映射相结合?

当一个属性的设置器更改其他属性(直接或通过使用设置器 - 这无关紧要)时,就会出现问题。

用于更好解释的示例类(在 PHP 中,但这并不重要 - 我认为):

}

这个示例的想法是:您可以设置成本(购买/创造产品)和您想要赚取的利润 - 然后计算价格(销售产品)。此外,您可以设置更改价格 - 然后计算利润。(改变成本可能会触发改变利润而不是价格,但这对问题无关紧要)。

例如:

由于许多原因(即命令行前端和 CRON 作业),我需要在“后端”代码中拥有丰富的对象。

在 HTML 前端中,您会获得包含 3 个输入的表单,这些输入对应于成本、利润和价格。当用户更改值并提交设置器的表单顺序时,确实很重要并且可能会搞砸。例如:

  • 用户去点击编辑产品按钮
  • 看到具有值的形式:成本=100,利润=10,价格=110
  • 将利润更改为 20
  • 提交表格

问题是:后端映射器从 POST 表单获取值并调用: setCost(100), setProfit(20) 然后 setPrice(110) 这很糟糕,因为它是旧价格,应该更改为 120(用户想要 20利润和 100 成本)。

我看到的唯一解决方案是在前端(在 JavaScript 中)也实现所有域模型逻辑,因此更改成本/利润输入会触发更改价格输入的值。然后所有输入都具有正确的值,并且可以放置已发布的数据而不会出现“覆盖”问题。使用此示例很容易,但当您有许多字段(用两种不同的语言编写相同的代码既耗时且容易出错)或它们之间的逻辑非常复杂(并非所有内容都可以在 JS 中轻松实现)时,这是不可能的。

任何想法如何解决这个问题?:)

PS:使用瞬态属性和惰性评估(即只有成本和价格是属性和可编辑的,并且总是计算利润)不是一种选择。我必须能够从这两种方式进行改变。对于一些繁重的计算也很不方便——所有的道具都必须存在,然后保存到数据库中。

0 投票
2 回答
947 浏览

c# - 了解丰富的域模型和依赖项

我试图了解丰富的域模型以及如何将语义功能构建到域实体中,其中域实体没有与提供语义行为实现的对象紧密耦合

例如,我想在User我的域模型中构建一个实体,但我希望它的实现由身份框架驱动

所以现在我有一个根据业务规则运行的域模型,并且对持久性和实现一无所知。

但是,当它们没有依赖关系并且不以任何方式与 and 耦合时,它们究竟DisableUser()应该AddToRole()如何UserManager工作RoleManager

  • 一般来说,我错过了什么?
  • 域实体是否应该依赖于提供行为的对象?
  • 我应该如何将我的域模型与实现提供者分离?
0 投票
1 回答
1136 浏览

node.js - How to handle Persistence with Rich Domain Model

I am redesigning my NodeJS application because I want to use the Rich Domain Model concept. Currently I am using Anemic Domain Model and this is not scaling well, I just see 'ifs' everywhere.

I have read a bunch of blog posts and DDD related blogs, but there is something that I simply cannot understand... How do we handle Persistence properly.

To start, I would like to describe the layers that I have defined and their purpose:

Persistence Model

  • Defines the Table Models. Defines the Table name, Columns, Keys and Relations
  • I am using Sequelize as ORM, so the Models defined with Sequelize are considered my Persistence Model

Domain Model

  • Entities and Behaviors. Objects that correspond to the abstractions created as part of the Business Domain
  • I have created several classes and the best thing here is that I can benefit from hierarchy to solve all problems (without loads of ifs yay).

Data Access Object (DAO)

  • Responsible for the Data management and conversion of entries of the Persistence Model to entities of the Domain Model. All persistence related activities belong to this layer
  • In my case DAOs work on top of the Sequelize models created on the Persistence Model, however, I am serializing the records returned on Database Interactions in different objects based on their properties. Eg.: If I have a Table with a column called 'UserType' that contains two values [ADMIN,USER], when I select entries on this table, I would serialize the return according to the User Type, so a User with Type: ADMIN would be an instance of the AdminUser class where a User with type: USER would simply be a DefaultUser...

Service Layer

  • Responsible for all Generic Business Logic, such as Utilities and other Services that are not part of the behavior of any of the Domain Objects

Client Layer

  • Any Consumer class that plays around with the Objects and is responsible in triggering the Persistence

Now the confusion starts when I implement the Client Layer...

Let's say I am implementing a new REST API:

On my handler function I would have something like:

One way I found to make it work is to merge the Persistence Model and the Domain Model, which means that oCurrentUser.addOrder(...) would execute the business logic required and would call the OrderDAO to persist the Order along with the Items in the end. The bad thing about this is that now the addOrder also have to handle transactions, because I don't want to add the order without the items, or update the User without the Order.

So, what I am missing here?

0 投票
0 回答
105 浏览

c# - 实体框架 - 不同于域模型的持久性模型

我有以下旧代码。持久模型和(贫血的)域模型之间存在分离。这种分离和隐式转换有什么好处?你看到什么缺点了吗?

我知道使用隐式转换是可能的:SplitAmountEF saEF = dbContext.SplitAmount.Find(id); 拆分金额 sa = saEF; //隐式转换。它们可以互换使用。

如果领域模型和持久性模型几乎一样,那么只使用持久性模型(根本不使用域模型)会更好吗?

例子: