domain-driven-design - DDD中服务的对与错
问题描述
如果我错了,请纠正我(并添加您认为正确的其他内容):
申请服务...
- 域的(公共前端)api
- 负责加载和保存骨料
- 可以访问存储库和其他基础设施服务
- 不是领域通用语言的一部分
- 应该/可能是域顶部的一个非常薄的层(主要处理聚合的加载/保存并将其余部分委托给域)
- 可以包含纯读操作
域名服务...
- 域的“真实”api
- 包含领域逻辑
- 仅适用于域对象(不适用于基础设施服务,例如 repos 和 email-sender-services)
- 通常包含编排不同聚合的代码
- 是领域普遍存在的语言的一部分
- 可以依赖其他域服务
- 仅包含修改操作
解决方案
您对应用程序服务的定义是正确的。我将应用程序服务更多地视为命令处理程序。接收命令,加载聚合,调用聚合方法并保存机会。在单个事务中处理一个命令。
域服务用于做聚合需要但不能做的事情。典型示例可能是从外部世界检索附加信息或进行一些计算。应用服务不一定知道聚合是否需要这个或那个信息,但它可以解决必要的依赖关系并在调用它时将域服务传递给聚合。
在我的实践中,域服务最常被实现为函数。请记住,域服务并非仅由聚合使用。复杂的值对象可以完美地使用领域服务来达到同样的目的。
在我的书中,我使用域服务来允许值对象确保它不会被包含亵渎的文本实例化。
public static DisplayName FromString(
string displayName,
CheckTextForProfanity hasProfanity)
{
if (displayName.IsEmpty())
throw new ArgumentNullException(nameof(FullName));
if (hasProfanity(displayName).GetAwaiter().GetResult())
throw new DomainExceptions.ProfanityFound(displayName);
return new DisplayName(displayName);
}
因此,在域中定义了域服务合同(在这种情况下为命名委托),
namespace Marketplace.Domain.Shared
{
public delegate Task<bool> CheckTextForProfanity(string text);
}
但它的实现是基础架构问题,并且正在应用程序端进行连接。
namespace Marketplace.Infrastructure
{
/// <summary>
/// PurgoMalum is a simple, free, RESTful web service for filtering and removing content of profanity, obscenity and other unwanted text.
/// Check http://www.purgomalum.com
/// </summary>
public class PurgomalumClient
{
private readonly HttpClient _httpClient;
public PurgomalumClient() : this(new HttpClient()) { }
public PurgomalumClient(HttpClient httpClient) => _httpClient = httpClient;
public async Task<bool> CheckForProfanity(string text)
{
var result = await _httpClient.GetAsync(
QueryHelpers.AddQueryString("https://www.purgomalum.com/service/containsprofanity", "text", text));
var value = await result.Content.ReadAsStringAsync();
return bool.Parse(value);
}
}
}
推荐阅读
- c++ - “转换”:不是“标准”的成员
- python - 发布删除特定行,将 .txt 转换为 .csv,并在 Python 中使用制表符分隔列
- c# - Unity3d:定位一个游戏对象,使其与其他两个游戏对象形成一个直角三角形
- java - 尝试调用虚拟方法 'android.text.Editable android.widget.EditText.getText()'
- sql - psql -f 命令不适用于指定的文件名路径
- node.js - package.json 语法错误
- r - 删除所有重复的列
- java - 使用 Eclipse 和 Apache Tomcat 9.0 开发环聊聊天机器人
- c - 使用 argv[] 时,我的代码不接受命令行参数
- sumo - 从 Sumo 接收错误速度值 (-1001)