當我需要調用某種業務方法時,即使操作與下面給出的操作一樣原始(僅將項添加到集合中),我也需要獲取與該操作相關的所有聚合根。我錯過了什麼?或者是基於CRUD的方法,其中運行單個查詢,包括表連接,最終選擇和插入 - 數據庫引擎爲您完成所有工作 - 在性能方面實際上更好?如何使用DDD高效地查詢多個聚合?
在下面的代碼中,我需要查詢單獨的聚合根(它創建另一個數據庫連接併發送另一個select查詢)。在真實世界的應用程序中,我一直在查詢大量多個單一聚合,對於單個業務活動最多隻能查詢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);
}
}
可能的解決方法
我已經告訴你可以通過這樣的另一個聚集的只是一個編號:
class Device
{
void AddParameter(ParameterId parameterId)
{
parameters.Add(parameterId);
}
}
但海事組織打破封裝(明確強調業務中的術語ID),也不防止粘貼錯誤或其他不正確的身份(由用戶創建)。
而Vaughn Vernon給出了使用第一種方法(傳遞整個聚合實例)的應用程序服務的示例。
我可以直接添加/刪除IDS,而不是自己聚合? – EwanCoder