일부 비즈니스 메소드를 호출해야 할 때, 작업이 아래에 주어진 것과 같은 프리미티브 (컬렉션에 항목을 추가하는 것) 일지라도 작업과 관련된 모든 집계 루트를 가져와야합니다. 내가 뭘 놓치고 있니? 또는 테이블 조인을 포함하여 하나의 쿼리를 실행하고 마지막에 선택하고 삽입하는 CRUD 기반 접근 방식이며 데이터베이스 엔진이 모든 작업을 실제로 수행합니다. 실제로 성능면에서 더 낫습니다.DDD로 여러 집계를 효율적으로 쿼리하는 방법은 무엇입니까?
아래 코드에서 별도의 집계 루트 (다른 데이터베이스 연결을 만들고 다른 선택 쿼리를 보냄)를 쿼리해야합니다. 실제 응용 프로그램에서는 단일 비즈니스 조치에 대해 최대 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를 명시 적으로 강조하여) 인 캡슐 레이션을 중단하고 잘못된 (사용자가 만든) 잘못된 ID를 붙여 넣는 것을 막지 않습니다.
Vaughn Vernon은 첫 번째 방법 (전체 집계 인스턴스 전달)을 사용하는 응용 프로그램 서비스의 예를 제공합니다.
직접 집계하지 않고 IDS를 직접 추가/삭제할 수 있습니까? – EwanCoder