【发布时间】:2017-05-17 11:25:12
【问题描述】:
当我需要调用某个业务方法时,我需要获取与该操作相关的所有聚合根,即使该操作与下面给出的操作一样原始(只是将项目添加到集合中)。我错过了什么?或者是基于 CRUD 的方法,您在其中运行一个查询,包括表连接、选择和最后插入 - 数据库引擎为您完成所有工作 - 实际上在性能方面更好?
在下面的代码中,我需要查询单独的聚合根(创建另一个数据库连接并发送另一个选择查询)。在现实世界的应用程序中,我一直在查询不止一个聚合,单个业务操作最多查询 8 个。如何提高性能/查询开销?
域聚合根:
class Device
{
Set<ParameterId> parameters;
void AddParameter(Parameter parameter)
{
parameters.Add(parameter.Id);
}
}
class Parameter
{
ParameterId Id { get; }
}
应用层:
class DeviceApplication
{
private DeviceRepository _deviceRepo;
private ParameterRepository _parameterRepo;
void AddParameterToDevice(string deviceId, string parameterId)
{
var aParameterId = new ParameterId(parameterId);
var aDeviceId = new DeviceId(deviceId);
var parameter = _parameterRepo.FindById(aParameterId);
if (parameter == null) throw;
var device = _deviceRepo.FindById(aDeviceId);
if (device == null) throw;
device.AddParameter(parameter);
_deviceRepo.Save(device);
}
}
可能的解决方案
有人告诉我,您可以像这样只传递另一个聚合的 Id:
class Device
{
void AddParameter(ParameterId parameterId)
{
parameters.Add(parameterId);
}
}
但 IMO 打破了封装(通过明确强调术语 ID 到业务中),也不能防止粘贴错误或其他不正确的身份(由用户创建)。
Vaughn Vernon 给出了使用第一种方法(传递整个聚合实例)的应用程序服务示例。
【问题讨论】:
-
我可以直接添加/删除IDS,而不是自己聚合吗?
标签: repository domain-driven-design aggregateroot