- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个聚合域,将其称为“Order”,其中包含一个 OrderLines 列表。订单跟踪订单行上的金额总和。客户有一个运行中的“信用”余额,他们可以从中订购,这是通过汇总他们的数据库交易历史计算得出的。一旦他们用完了“资金池”中的所有资金,他们就不能再订购任何产品。
因此,每次向订单添加一行时,我都需要检查池中还剩下多少,以及订单是否超过了订单。池中的金额不断变化,因为其他相关客户不断使用它。
问题是,从 DDD 的角度考虑,我如何获得这个数量,因为我不想用 DataContext 问题污染我的领域层(在这里使用 L2S)。由于我不能只从域中查询数据库,我该如何获取该数据以便验证业务规则?
这是使用领域事件的实例吗?
最佳答案
您的订单聚合应该被完全封装。因此,它需要能够确定添加项目是否有效,即是否超过客户信用。有多种方法可以做到这一点,但它们都依赖于 Order 存储库返回一个知道如何执行此特定操作的特定聚合。例如,这可能与您用于满足订单的订单聚合不同。
在这种情况下,您必须识别并在代码中捕获您期望订单履行特定角色的事实,即添加额外订单项的角色。为此,您可以为此角色创建一个接口(interface),并创建一个具有对该角色的内部支持的相应聚合。
然后,您的服务层可以向您的 Order 存储库请求满足此显式角色接口(interface)的订单,因此该存储库有足够的信息来说明您需要什么来构建满足该要求的东西。
例如:
public interface IOrder
{
IList<LineItem> LineItems { get; }
// ... other core order "stuff"
}
public interface IAddItemsToOrder: IOrder
{
void AddItem( LineItem item );
}
public interface IOrderRepository
{
T Get<T>( int orderId ) where T: IOrder;
}
现在,您的服务代码如下所示:
public class CartService
{
public void AddItemToOrder( int orderId, LineItem item )
{
var order = orderRepository.Get<IAddItemsToOrder>( orderId );
order.AddItem( item );
}
}
接下来,实现 IAddItemsToOrder
的 Order 类需要一个客户实体,以便它可以检查贷方余额。因此,您只需通过定义特定接口(interface)来级联相同的技术。订单存储库可以调用客户存储库以返回履行该角色的客户实体并将其添加到订单聚合中。
因此,您将拥有一个基本的 ICustomer
接口(interface),然后是一个从它派生的 ICustomerCreditBalance
接口(interface)形式的显式角色。 ICustomerCreditBalance
充当您的客户存储库的标记接口(interface),告诉它您需要客户做什么,因此它可以创建适当的客户实体,并且它具有方法和/或属性来支持特定角色。像这样的东西:
public interface ICustomer
{
string Name { get; }
// core customer stuff
}
public interface ICustomerCreditBalance: ICustomer
{
public decimal CreditBalance { get; }
}
public interface ICustomerRepository
{
T Get<T>( int customerId ) where T: ICustomer;
}
明确的角色接口(interface)为存储库提供了他们需要的关键信息,以便他们就从数据库中获取哪些数据以及是急切还是延迟获取做出正确的决定。
请注意,在这种情况下,我已将 CreditBalance
属性放在 ICustomerCreditBalance
接口(interface)上。但是,它也可以在基础 ICustomer
接口(interface)上,然后 ICustomerCreditBalance
变成一个空的“标记”接口(interface),让存储库知道您将要查询贷方余额。这一切都是为了让存储库知道您希望它返回的实体扮演什么角色。
正如您在问题中提到的,将所有这些结合在一起的最后一部分是域事件。如果超过客户的信用余额,订单可以引发失败域事件,以通知服务层订单无效。另一方面,如果客户有足够的信用,它可以更新客户对象上的余额或引发域事件以通知系统的其余部分需要减少余额。
我没有将域事件代码添加到 CartService
类中,因为这个答案已经很长了!如果您想了解更多关于如何做到这一点的信息,我建议您发布另一个针对该特定问题的问题,我会在那里展开讨论;-)
关于domain-driven-design - 获取域实体的附加数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1242552/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!