저는 응용 프로그램/도메인 계층에서 DDD를 사용하여 event-sourced CQRS 구현 작업을하고 있습니다. 지금까지, 사람과 예약이 모두 두 가지 이유에 대한 별도의 집계 뿌리입니다이벤트 출처가있는 집계 루트가 이벤트 소싱 저장소에 액세스 할 수 있습니까?
DDD에 대한 이해와public class Person : AggregateRootBase
{
private Guid? _bookingId;
public Person(Identification identification)
{
Apply(new PersonCreatedEvent(identification));
}
public Booking CreateBooking() {
// Enforce Person invariants
var booking = new Booking();
Apply(new PersonBookedEvent(booking.Id));
return booking;
}
public void Release() {
// Enforce Person invariants
// Should we load the booking here from the aggregate repository?
// We need to ensure that booking is released as well.
var booking = BookingRepository.Load(_bookingId);
booking.Release();
Apply(new PersonReleasedEvent(_bookingId));
}
[EventHandler]
public void Handle(PersonBookedEvent @event) { _bookingId = @event.BookingId; }
[EventHandler]
public void Handle(PersonReleasedEvent @event) { _bookingId = null; }
}
public class Booking : AggregateRootBase
{
private DateTime _bookingDate;
private DateTime? _releaseDate;
public Booking()
{
//Enforce invariants
Apply(new BookingCreatedEvent());
}
public void Release()
{
//Enforce invariants
Apply(new BookingReleasedEvent());
}
[EventHandler]
public void Handle(BookingCreatedEvent @event) { _bookingDate = SystemTime.Now(); }
[EventHandler]
public void Handle(BookingReleasedEvent @event) { _releaseDate = SystemTime.Now(); }
// Some other business activities unrelated to a person
}
: :이처럼 보이는 개체 모델이
- 가 있습니다 시간을 때 비즈니스 구성 요소 것 데이터베이스와 별도로 Booking 개체를 끌어옵니다. (즉, 발표 된 사람이 잘못된 정보로 인해 이전 예약이 수정 된 경우).
- 예약을 업데이트해야 할 때마다 Person과 Booking간에 잠금 경합이 없어야합니다.
기타 비즈니스 요구 사항 중 하나는 한 번에 한 명 이상 사람을 위해 예약 할 수 없다는 것입니다. 이 때문에 잠재적으로 일부 불일치가있을 수 있으므로 (CQRS를 사용하고 결국 일관성있는 읽기 데이터베이스가 있기 때문에) 읽기 측에서 쿼리 데이터베이스를 쿼리하는 데 걱정이됩니다.
개체의 ID로 이벤트 소스 저장소를 쿼리 할 수 있어야합니까 (필요한 경우 지연로드)? 더 이해하기 쉬운 구현 방법이 있습니까?
"(식별 식별) { 적용 (새 PersonCreatedEvent (식별)); } 공공 사람"당신이 메모리에서 개체를 구축하는 경우 어떤 일이 발생, 당신은 새로운 사람을 만들지 않았하지만 당신은 출판 될 것입니다 새로운 사건. 나는 이벤트 핸들러를 정의하는 방식을 좋아한다.그래서 객체의 상태가 리포지토리에 명령을 적용 할 때만 변경 될 수 있다는 것을 알고 있으므로 전체 이벤트 기반으로 진행하지 않는 한 명령 핸들러도 추가해야합니다. IMHO는별로 의미가 없습니다. – Marco
내가 알 수없는 것은 자신의 저장소가 게시해야하는 이벤트를 처리하는 이유입니다. "BookingCreatedEvent" – Marco