问题标签 [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 投票
3 回答
797 浏览

domain-driven-design - 应该如何使用领域驱动设计来实现服务?

在遵循领域驱动设计时,实际实现服务类的最佳方式是什么?

例如说我想要一个AccountService可以用来将资金从一个帐户转移到另一个帐户?以下哪一项(如果有)是实现这一点的最佳方式?

0 投票
2 回答
174 浏览

c# - 另一个应用架构问题

我正在尝试一些 DDD,我将尝试以最简单的方式描述我所做的事情。

核心项目
核心项目包含实体、VO 和领域服务。例如,我有User实体和UserRelation实体。我想我们都知道什么是用户实体。UserRelation包含有关用户如何相互连接的信息,例如关注和连接(双向关注)。因此,我有带有无状态方法的UserDomainService,例如 Follow(user,user) 和 Connect(user, user)。

存储库项目

我正在使用 NHibernate,所以我决定不创建这样的项目。相反,我直接使用 NHibernate。例如,在我的 UI 中,我从数据库中获取一个用户对象,对其进行更改,然后调用 session.Save(user)。

问题

如果我想做如下操作,我这样做:

  • 从 DB 获取一些信息
  • 从服务调用 Follow(user1, user2)
  • 将 UserRelation 对象保存到 DB 最后,应用程序代码变得有点复杂。想象一下,如果我们想在 2-3 个地方使用此代码,并且在某些时候我们必须对其进行重构。

我的解决方案
我的解决方案是创建一个 ApplicationService 项目,该项目将完成繁琐的工作并强制消费者使用 ApplicationService 而不是直接使用实体和域服务

这个应用服务是好是坏?正如您所看到的,新服务也充当存储库,因此我们可以创建一个 UserRepository 类,但现在让我们跳过它。困扰我的是这两种方法中的参数。他们接受Guids,服务从数据库中检索用户。另一种选择是直接传递用户对象。ChangeUsername 方法类似于 User 实体 + 持久性中的方法。

那么,您对此有何看法?

0 投票
1 回答
1579 浏览

service - DDD:可以将服务注入实体吗

我有一棵Zone对象树:

Zone中没有 childrennordescendants属性,因为我想避免在域模型中管理这些关系的痛苦。

相反,域服务在数据库中维护一个闭包表,以将一个区域映射到它的所有后代,在任何级别。

现在,我有一个User可以分配一个或多个区域:

我的问题是,在为用户分配新区域之前,我想检查该区域是否尚未通过其后代之一显式或隐式分配。

因此,我希望我的控制器将服务暂时注入此方法,以执行必要的检查:

这是一个好的做法,或者如果不是,那么正确的选择是什么?

0 投票
4 回答
1031 浏览

php - PHP & DDD:如何确保只有服务可以调用实体上的方法?

我正在使用一个域模型,其中我有一个 Reservation 类:

因为该changeStatus()方法只能在发送所有适当通知(电子邮件,...)的上下文中调用,所以我想将此方法的调用限制为ReservationService

因为我正在使用 PHP,所以没有包可见性朋友类这样的概念,所以我的changeStatus()方法只是公共的,因此可以从应用程序的任何地方调用。

我发现这个问题的唯一解决方案是使用某种双重调度

潜在的缺点是:

  • 这使设计有点复杂
  • 这使实体知道服务,不确定这是否真的是一个缺点

你们对上述解决方案有什么意见,或者有更好的设计建议限制对这种changeStatus()方法的访问吗?

0 投票
3 回答
1936 浏览

.net - 如何在洋葱架构上实现服务和存储库?

这几天我一直在研究洋葱架构。我了解依赖项应该始终朝向中心,以及如何使用依赖项注入来实现这一点。但是我有几个问题我仍然无法弄清楚。

  1. 模型(或实体)可以引用存储库接口或服务接口吗?

    eg:一个Order实体有一个DeliveryCity通过Oder.DeliveryZip属性建立的关系,它不是外键,而是唯一的。为了得到城市的拉链,我必须打电话ICityRepository.FindByZip(zip)

    我的模型中有以下代码

    /li>
  2. 上面的代码会有什么问题?它应该改用域服务吗?

  3. 领域服务实现应该在核心层还是在基础设施层定义?

0 投票
2 回答
1272 浏览

domain-driven-design - 用 DDD 连接点

我读过 Evans、Nilsson 和 McCarthy 等书,了解领域驱动设计背后的概念和推理;但是,我发现很难将所有这些放在一个真实世界的应用程序中。缺乏完整的例子让我摸不着头脑。我找到了很多框架和简单的示例,但到目前为止还没有真正展示如何在 DDD 之后构建真正的业务应用程序。

以典型的订单管理系统为例,以订单取消为例。在我的设计中,我可以看到一个带有 CancelOrder 方法的 OrderCancellationService,它接受订单 # 和一个原因作为参数。然后它必须执行以下“步骤”:

  1. 验证当前用户是否具有取消订单的必要权限
  2. 从 OrderRepository 中检索具有指定订单 # 的订单实体
  3. 验证订单是否可能被取消(服务是否应该询问订单的状态以评估规则,或者订单是否应该具有封装规则的 CanCancel 属性?)
  4. 通过调用 Order.Cancel(reason) 更新 Order 实体的状态
  5. 将更新的订单保存到数据存储中
  6. 联系 CreditCardService 以恢复已处理的任何信用卡费用
  7. 为操作添加审核条目

当然,所有这些都应该发生在一个事务中,并且不应该允许任何操作独立发生。我的意思是,如果我取消订单,我必须恢复信用卡交易,我无法取消并且不执行此步骤。这,imo,建议更好的封装,但我不想在我的域对象(订单)中依赖 CreditCardService,所以这似乎是域服务的责任。

我正在寻找有人向我展示如何/应该如何“组装”的代码示例。代码背后的思考过程将有助于让我为自己连接所有的点。谢谢!

0 投票
3 回答
1166 浏览

domain-driven-design - 在 DDD 中,任何不是实体或值对象的类都应该是服务吗?

在 DDD 中,任何不是实体或值对象的类都应该是服务吗?

例如,在库中,一些类被命名FileReader(读取 File 对象),CacheMemcachedCacheor实现的接口FileCache,XXXManager,...

我理解在 DDD 之外,您可以随意命名您的课程。

但是在 DDD(以及相同的示例)中,我应该将我的类命名为、 、FileReadingService、等CacheService实现吗?FileCacheServiceXXXService

0 投票
1 回答
5812 浏览

domain-driven-design - DDD 中的工厂、服务、存储库

我对DDD中的工厂存储库服务有一些疑问。我有以下实体:文件夹、文件、FileData。

在我看来,“文件夹”是一个聚合根,应该负责创建 File 和 FileData 对象。

所以我的第一个问题是我应该使用工厂来创建这个聚合还是由存储库决定?此时我有 2 个存储库,一个用于文件夹,另一个用于文件,但在我看来,我应该将它们合并在一起。以下代码片段显示了我的Folder Repository,它位于我的基础设施层中:

接下来我在我的应用层创建了一个服务,称为“IoService”。我对服务的位置有疑问。是否应该将其移至域层

总结一下:我是否应该使用该服务来创建文件夹对象。或者服务应该只使用一个工厂,它负责创建对象并将创建的对象发送到存储库?那么服务中的依赖注入呢,我应该从 UI 层使用Unity等 IOC 容器注入我的服务,还是应该只对服务中的依赖项进行硬编码?

谢谢

0 投票
1 回答
635 浏览

domain-driven-design - Instantiating objects - Polymorphism

I have a financial application that processes 'bonds'. I need to

  1. Model the application to avoid an anaemic model (which i understand is bad).
  2. Instantiate different implementations depending on the type of bond.

The system gets instructions from an external system, and applies the instructions to the specified bond. hence i have an Instruction entity

e.g. of an instruction to vote 'yes' for a resolution passed on the bond

and a Bond entity

However, an instruction usually does more than just one thing (it is effectively many instructions in one), e.g. an instruction to cancel a previous instruction, that would mean, firstly, it cancels a previous transaction, then certain values need to be recalculated. Also, a single instruction can come overloaded, it can be to cancel a previous instruction as well as vote for a resolution.

I have been advised to use a domain service to process a new instruction.

The problem i see with this structure is that for each instruction, all methods are called even if the method is not relevant. I could use some if statements but then the code would look untidy.

Now my question is,

  1. Is this the best way to model?
  2. And for the calculation, depending on the bond type the calculation differs. So i want to implement polymorphism. I have been told that i need to use a factory to instantiate the correct implementation. Is this the best approach?

For BondType 1,3,5 i use calculationA, for bondType 2,7... i need to use Calculation B. how do i INSTANTIATE the different calc types??? NB, i am well versed with polymorphism, however, i have been unable to find solid examples of how to instantiate the correct implementation. thnx for reading this far...

0 投票
2 回答
2775 浏览

domain-driven-design - DDD 领域服务:一个服务类应该包含什么?

在领域驱动设计中,领域服务应该包含自然不属于实体内部的操作。

我有为每个实体创建一个服务并在其中分组一些方法(Organization实体和OrganizationService服务)的习惯。

但我越想:OrganizationService这并不意味着什么,“组织不是一种服务,它是一个东西。

所以现在我必须添加一个组织深拷贝功能,它将复制整个组织聚合,所以我想把它放在一个服务中。

我应该这样做:OrganizationService::copyOrganization(o)

或者我应该这样做:OrganizationCopyService::copyOrganization(o)

更一般地说: “服务”是包含多个操作的抽象概念,还是服务是具体操作?

编辑:鉴于第一个例子不太好,更多例子:

  • StrategyService::apply()/cancel()还是StrategyApplicationService::apply()/cancel()?(此处的“应用程序”与应用程序层无关;)
  • CarService::wash()还是CarWashingService::wash()

在所有这些示例中,最具体的服务名称似乎是最合适的。毕竟,在现实生活中,“洗车服务”是有道理的。但我最终可能会得到很多服务......

*注意:这不是关于意见的问题!这是一个关于领域驱动设计方法的精确、可回答的问题。当问“我应该”时,我总是厌倦接近投票,但有一种DDD 做事方式。*