问题标签 [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.
oop - 我们如何在我们的领域模型中处理删除的不同含义
我有两个与 Udi Dahan 的文章有关的问题:不要删除 – 只是不要
- 有时我们确实需要删除,用户(领域专家)请求
delete
错误数据的功能(真正含义),假设 HR 用户有一个添加员工的表单,他插入了错误的员工数据,他想删除这些数据,不是用于商业,它与Retire or Fire an employee
. 执行中如何处理这两种情况? - 如何让 UI 更能代表这个案例?使用两个按钮 一个仅在我们可以
DELETE
雇用时显示,另一个在我们想RETIRE
雇用时显示?
oop - 在我理解 DDD 的过程中遇到了一个令人困惑的情况
提前感谢您的帮助和关注!
我的项目仅用于学习目的,我对 DDD 完全感到困惑,并且有以下情况:
在我拥有用户和文档的领域中,有一种无处不在的语言。它说:
这足以理解和回答我的问题:
用户可以包含以下方法是否正常:CreateDocument(params)、SendDocumentForApproval(docId)、ApproveApprovalStepOfDocument(stepId)?
我对它感到困惑,因为它在代码中看起来有点奇怪。
例如,对于文档创建过程,我们有类似的东西:
审批流程:
我想更详细地解释我的想法。让我们看看用户。他们管理文件。没有用户,文档就无法存在。这是否意味着用户是一个聚合根,我们需要创建、更新、删除它的聚合。
并且该文档也是一个聚合根,因为它包含一个批准过程。没有文档,ApprovalProcess 就不能存在。
这是否意味着我需要做这样的事情:
非常感谢你,对我糟糕的英语感到抱歉!此致
domain-driven-design - 我应该在哪里检查 ddd 架构中的唯一性
在我的域模型中,我有一个客户聚合根。我的业务规则是 -> 我不能添加具有相同名字、姓氏和电子邮件地址的新客户。这种验证检查的最佳地点在哪里?
首先,从我的角度来看,将这种支票放在我的客户集合中是完全错误的。 其次,在我的 CustomerRepository 中添加此验证也感觉不自然,因为我想在内存集合中将它们视为简单,并且我的所有聚合的逻辑基本相同。 第三,我也不打算在我的 CreateCustomer-Command 中添加这个检查,因为这个重要的检查不在我的域模型之外。
所以我看到的最后一个选项是创建一个 CustomerService 类并将这种验证放在这里。
你还有什么建议吗?我已经阅读了许多其他帖子,但他们并没有真正给出明确的答案......谢谢!
domain-driven-design - 前端的业务逻辑与 ddd 微服务后端重复
这是一个具有现实意义的抽象问题。
我有两个微服务;让我们称它们为CreditCardsService
和SubscriptionsService
。
我还有一个应该使用的 SPA,SubscriptionsService
以便客户可以订阅。为此,SubscriptionsService
有一个端点,您可以在其中POST
使用订阅模型来创建订阅,并且在该模型中是creditCardId
指向应支付订阅费用的信用卡。有某些业务规则规定您是否可以使用所述信用卡进行订阅(到期时间超过 12 个月,它是 VISA 等)。这些特定的业务规则与SubscriptionsService
问题是从事 SPA 的团队想要一个/CreditCards
端点,该端点SubscriptonsService
返回可以在订阅模型中使用的用户的所有有效信用卡。他们不想在 SPA 中实现与SubscriptionsService
自身相同的业务验证规则。
对我来说,这似乎违背了微服务设计的核心原则。特别是关注点分离。我也问自己,这要开什么先例?我们是否必须向/CreditCards
OrdersService 或任何其他可能creditCardId
用作其模型属性的服务添加端点?
所以主要的问题是:设计这个的最好方法是什么?业务验证逻辑是否应该在前端和后端之间重复?是否应该将此新端点添加到SubscriptionsService
? 我们是否应该尝试简化业务逻辑?
asp.net-mvc - 如何从控制器调用 SQL 函数
类的结构如下。MVC asp.net 页面
控制器调用应用程序服务来获取数据并将数据发布到数据库。
工作单元使用域实体类从数据库插入、更新和读取数据。
我的问题是我在哪里调用 sql 函数
从应用程序服务中,我需要有单独的域服务来执行所有这些 sql 调用吗?或者我可以直接从应用程序服务调用 sql 函数并在那里公开函数名吗?我在 Google 时读到我们需要使用 CQRS 来调用 procs 和函数。我不明白如何实现这一目标。请建议
events - DDD、领域服务和事件
情况:
为了处理领域事件,Jimmy Bogart提出了一种在聚合中存储事件的方法。
在我看来,这是一种非常方便的方法。但是,域服务中出现域事件的情况呢?
域服务不应该有状态(无状态)。在这种情况下,理论上必须将 IDispatcher 事件调度程序注入到此类服务的构造函数中。
问题:
为了避免引入事件调度程序的域服务,建议的替代方法是正确的:
- 将最后一次操作的事件保存在域服务中。但是,这将违反域服务的无状态原则。
- 根据操作结果从服务方法返回事件列表(在返回方法中或以其他方式,取决于编程语言的能力)。
oop - 服务访问实体属性
在 oop 中,我们寻求封装。我们尽量不通过 getter 或公共字段公开内部状态,只公开方法。
到目前为止,一切都很好。
在我们想对多个实体进行操作的情况下,我们引入了Service。但是这项服务如何能够在这些实体上自由运行呢?
如果所有(服务和实体)都在同一个包中,实体可以公开包私有方法或字段,服务可以使用它们,保留封装。但是当实体和服务来自不同的包时呢?似乎实体应该公开公共获取器(贫血模型的第一步和实体逻辑的泄漏),或者执行特定于服务需求的逻辑的公共方法,可能仅由该服务的要求引入 - 似乎也很糟糕。如何解决这个问题?
oop - 如何在 DDD 中组合来自不同限界上下文的数据
例子:
我有两个有界上下文Exams
和Courses
. Exams 上下文有一个Student
实体,其中包含有关参加考试的学生的信息。Courses 上下文有一个教师实体,其中包含有关教授课程的教师的信息。
我还有一个AuthService
(纯 CRUD),用于用户的身份验证和授权。有AuthService
一个Accounts
实体,其中包含帐户用户名、地址、电话号码等信息
将它们放在一起,TheStudent
和Teacher
两者都有帐户,因此他们的信息已经可用。
我对此有几个问题。
- 将 AccountId 存储在学生和教师实体中是否是 DDD 中的反模式?如果不是反模式,什么时候可以使用 AccountId、In repository 或 API 控制器收集学生帐户信息,或者我们应该使用 RPC/API 调用。
- 是否可以将所需的详细信息从 Account 实体复制到 Student 或 Teacher 实体?
entity - DDD:实体应该包含哪些方法?
我有代表用户授权的类(scala代码):
该类在应用程序中的许多地方使用,以检查用户是否对特定实体具有特定权限,例如:
authorization.isAllowed(s"some/entity/path/$id", "read")
为了提高可用性并避免直接的字符串操作,我将这些方法包装在更具体的方法中:
以此类推,最多 20 种方法。应该Authorization
包含这样的方法canViewCompany()
吗?
此类是否有责任了解每个特定实体检查?
更新:所以最终的问题是:
canViewCompany(companyId:UUID)
为了提高类的可用性而创建包装器是个好主意 吗?- 如果是这样,应该将这些方法
Authorization
本身替换还是提取到某些服务中,例如:PermissionService.canViewCompany(id,authorization)=authorization.isAllowed()?
design-patterns - 域驱动实现 - 更新聚合根中的单个属性
我是 DDD 的新手,我想对我在实施它时面临的一些挑战提出一些建议。
我正在使用 Typescript 开发应用程序。数据保存在关系数据库中。我们没有遵循 CQRS 模式,我们的读取和写入发生在同一个数据库中。
假设我有一个User
大致如下所示的聚合,
在这里,Phone
and Email
are ValueObjects
and Address
is an Entity
.
该类Email
也类似于Phone
.
现在,一旦在控制器中接收到更新电话请求,请求就会被转发到User Service
层,服务将大致如下所示,
在这里,每次用户请求更新电话号码时,我都会从 RDBMS 中获取用户数据,并对所有已验证的字段进行所有验证,然后调用方法User.update()
。所以,这是我的问题:
- 不确定上述方法是否正确,因为我正在验证我已经验证过的东西,并且可能是不必要的数据库调用。因此,请向我建议处理此类情况的最佳实践,即要求更新单个或仅几个字段。
- 用户可以独立于他的其他信息更新他的地址。那么,
Address
实体应该是独立的Aggregate Root
吗?如果是,如果在单个 http-request 中同时请求更新 UserInfo 和 Address,应该如何处理? - 聚合根在删除中的作用是什么?应该如何在其中建模?
如果您在设计中发现任何其他缺陷,请告诉我。
谢谢!