问题标签 [ddd-service]

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 投票
1 回答
45 浏览

oop - 我们如何在我们的领域模型中处理删除的不同含义

我有两个与 Udi Dahan 的文章有关的问题:不要删除 – 只是不要

  • 有时我们确实需要删除,用户(领域专家)请求delete错误数据的功能(真正含义),假设 HR 用户有一个添加员工的表单,他插入了错误的员工数据,他想删除这些数据,不是用于商业,它与Retire or Fire an employee. 执行中如何处理这两种情况?
  • 如何让 UI 更能代表这个案例?使用两个按钮 一个仅在我们可以DELETE雇用时显示,另一个在我们想RETIRE雇用时显示?
0 投票
2 回答
169 浏览

oop - 在我理解 DDD 的过程中遇到了一个令人困惑的情况

提前感谢您的帮助和关注!

我的项目仅用于学习目的,我对 DDD 完全感到困惑,并且有以下情况:

在我拥有用户和文档的领域中,有一种无处不在的语言。它说:

这足以理解和回答我的问题:

用户可以包含以下方法是否正常:CreateDocument(params)、SendDocumentForApproval(docId)、ApproveApprovalStepOfDocument(stepId)?

我对它感到困惑,因为它在代码中看起来有点奇怪。

例如,对于文档创建过程,我们有类似的东西:

审批流程:

我想更详细地解释我的想法。让我们看看用户。他们管理文件。没有用户,文档就无法存在。这是否意味着用户是一个聚合根,我们需要创建、更新、删除它的聚合。

并且该文档也是一个聚合根,因为它包含一个批准过程。没有文档,ApprovalProcess 就不能存在。

这是否意味着我需要做这样的事情:

非常感谢你,对我糟糕的英语感到抱歉!此致

0 投票
1 回答
250 浏览

domain-driven-design - 我应该在哪里检查 ddd 架构中的唯一性

在我的域模型中,我有一个客户聚合根。我的业务规则是 -> 我不能添加具有相同名字、姓氏和电子邮件地址的新客户。这种验证检查的最佳地点在哪里?

首先,从我的角度来看,将这种支票放在我的客户集合中是完全错误的。 其次,在我的 CustomerRepository 中添加此验证也感觉不自然,因为我想在内存集合中将它们视为简单,并且我的所有聚合的逻辑基本相同。 第三,我也不打算在我的 CreateCustomer-Command 中添加这个检查,因为这个重要的检查不在我的域模型之外。

所以我看到的最后一个选项是创建一个 CustomerService 类并将这种验证放在这里。

你还有什么建议吗?我已经阅读了许多其他帖子,但他们并没有真正给出明确的答案......谢谢!

0 投票
4 回答
871 浏览

domain-driven-design - 前端的业务逻辑与 ddd 微服务后端重复

这是一个具有现实意义的抽象问题。

我有两个微服务;让我们称它们为CreditCardsServiceSubscriptionsService

我还有一个应该使用的 SPA,SubscriptionsService以便客户可以订阅。为此,SubscriptionsService有一个端点,您可以在其中POST使用订阅模型来创建订阅,并且在该模型中是creditCardId指向应支付订阅费用的信用卡。有某些业务规则规定您是否可以使用所述信用卡进行订阅(到期时间超过 12 个月,它是 VISA 等)。这些特定的业务规则与SubscriptionsService

问题是从事 SPA 的团队想要一个/CreditCards端点,该端点SubscriptonsService返回可以在订阅模型中使用的用户的所有有效信用卡。他们不想在 SPA 中实现与SubscriptionsService自身相同的业务验证规则。

对我来说,这似乎违背了微服务设计的核心原则。特别是关注点分离。我也问自己,这要开什么先例?我们是否必须向/CreditCardsOrdersService 或任何其他可能creditCardId用作其模型属性的服务添加端点?

所以主要的问题是:设计这个的最好方法是什么?业务验证逻辑是否应该在前端和后端之间重复?是否应该将此新端点添加到SubscriptionsService? 我们是否应该尝试简化业务逻辑?

0 投票
1 回答
491 浏览

asp.net-mvc - 如何从控制器调用 SQL 函数

类的结构如下。MVC asp.net 页面

控制器调用应用程序服务来获取数据并将数据发布到数据库。

工作单元使用域实体类从数据库插入、更新和读取数据。

我的问题是我在哪里调用 sql 函数

从应用程序服务中,我需要有单独的域服务来执行所有这些 sql 调用吗?或者我可以直接从应用程序服务调用 sql 函数并在那里公开函数名吗?我在 Google 时读到我们需要使用 CQRS 来调用 procs 和函数。我不明白如何实现这一目标。请建议

0 投票
1 回答
558 浏览

events - DDD、领域服务和事件

情况:

为了处理领域事件,Jimmy Bogart提出了一种在聚合中存储事件的方法。

在我看来,这是一种非常方便的方法。但是,域服务中出现域事件的情况呢?

域服务不应该有状态(无状态)。在这种情况下,理论上必须将 IDispatcher 事件调度程序注入到此类服务的构造函数中。

问题:

为了避免引入事件调度程序的域服务,建议的替代方法是正确的:

  1. 将最后一次操作的事件保存在域服务中。但是,这将违反域服务的无状态原则。
  2. 根据操作结果从服务方法返回事件列表(在返回方法中或以其他方式,取决于编程语言的能力)。
0 投票
3 回答
82 浏览

oop - 服务访问实体属性

在 oop 中,我们寻求封装。我们尽量不通过 getter 或公共字段公开内部状态,只公开方法。

到目前为止,一切都很好。

在我们想对多个实体进行操作的情况下,我们引入了Service。但是这项服务如何能够在这些实体上自由运行呢?

如果所有(服务和实体)都在同一个包中,实体可以公开包私有方法或字段,服务可以使用它们,保留封装。但是当实体和服务来自不同的包时呢?似乎实体应该公开公共获取器(贫血模型的第一步和实体逻辑的泄漏),或者执行特定于服务需求的逻辑的公共方法,可能仅由该服务的要求引入 - 似乎也很糟糕。如何解决这个问题?

0 投票
2 回答
1804 浏览

oop - 如何在 DDD 中组合来自不同限界上下文的数据

例子:

我有两个有界上下文ExamsCourses. Exams 上下文有一个Student实体,其中包含有关参加考试的学生的信息。Courses 上下文有一个教师实体,其中包含有关教授课程的教师的信息。

我还有一个AuthService(纯 CRUD),用于用户的身份验证和授权。有AuthService一个Accounts实体,其中包含帐户用户名、地址、电话号码等信息

将它们放在一起,TheStudentTeacher两者都有帐户,因此他们的信息已经可用。

我对此有几个问题。

  1. 将 AccountId 存储在学生和教师实体中是否是 DDD 中的反模式?如果不是反模式,什么时候可以使用 AccountId、In repository 或 API 控制器收集学生帐户信息,或者我们应该使用 RPC/API 调用。
  2. 是否可以将所需的详细信息从 Account 实体复制到 Student 或 Teacher 实体?
0 投票
4 回答
631 浏览

entity - DDD:实体应该包含哪些方法?

我有代表用户授权的类(scala代码):

该类在应用程序中的许多地方使用,以检查用户是否对特定实体具有特定权限,例如:

authorization.isAllowed(s"some/entity/path/$id", "read")

为了提高可用性并避免直接的字符串操作,我将这些方法包装在更具体的方法中:

以此类推,最多 20 种方法。应该Authorization包含这样的方法canViewCompany()吗?
此类是否有责任了解每个特定实体检查?

更新:所以最终的问题是:

  1. canViewCompany(companyId:UUID)为了提高类的可用性而创建包装器是个好主意 吗?
  2. 如果是这样,应该将这些方法Authorization本身替换还是提取到某些服务中,例如:PermissionService.canViewCompany(id,authorization)=authorization.isAllowed()?
0 投票
1 回答
486 浏览

design-patterns - 域驱动实现 - 更新聚合根中的单个属性

我是 DDD 的新手,我想对我在实施它时面临的一些挑战提出一些建议。

我正在使用 Typescript 开发应用程序。数据保存在关系数据库中。我们没有遵循 CQRS 模式,我们的读取和写入发生在同一个数据库中。

假设我有一个User大致如下所示的聚合,

在这里,Phoneand Emailare ValueObjectsand Addressis an Entity.

该类Email也类似于Phone.

现在,一旦在控制器中接收到更新电话请求,请求就会被转发到User Service层,服务将大致如下所示,

在这里,每次用户请求更新电话号码时,我都会从 RDBMS 中获取用户数据,并对所有已验证的字段进行所有验证,然后调用方法User.update()。所以,这是我的问题:

  1. 不确定上述方法是否正确,因为我正在验证我已经验证过的东西,并且可能是不必要的数据库调用。因此,请向我建议处理此类情况的最佳实践,即要求更新单个或仅几个字段。
  2. 用户可以独立于他的其他信息更新他的地址。那么,Address实体应该是独立的Aggregate Root吗?如果是,如果在单个 http-request 中同时请求更新 UserInfo 和 Address,应该如何处理?
  3. 聚合根在删除中的作用是什么?应该如何在其中建模?

如果您在设计中发现任​​何其他缺陷,请告诉我。

谢谢!