1

나는 운송용 응용 프로그램을 설계하고 Clean Architecture를 사용하려고합니다. 사용자가 UI에서 버튼을 클릭 할 때마다 새 객체를 다시 인스턴스화 할 필요가 없도록 Shipment 객체의 상태를 유지할 위치를 파악하려고합니다. 여기에 흐름이 있습니다.DDD 저장소를 상태 유지할 수 있습니까?

  1. 사용자는 UI 이벤트를 처리하는 UI
  2. UI 제어기 배송 번호를 입력하여 사용 사례 인터랙 (A)의 인스턴스를 인스턴스화한다. Use Case Interactor의 생성자에 전달 된 저장소 인스턴스
  3. Use Case 인터랙터는 팩토리 (예 : CREATE_BY_DELIVERY)를 호출하여 Shipment 인스턴스를 인스턴스화합니다. 팩토리는 Repository를 호출하여 데이터베이스에서 데이터를 수집합니다.
  4. 배달 데이터가 UI
  5. 사용자에 채워진 것은 다음
  6. UI 컨트롤러의 버튼 클릭 이벤트를 처리하고 사용 사례 인터랙 a의 RATE_QUOTE 메소드를 호출하는 요금 견적 버튼을 클릭합니다. 유스 케이스 인터랙 터는 3 단계에서와 같이 선적 팩토리를 다시 호출해야합니까? 아니면 유스 인터랙 터가 3 단계에서 이미 생성 된 선적 객체의 인스턴스를 가져올 수 있습니까?
  7. 요금은
  8. UI 컨트롤러의 버튼 클릭 이벤트를 처리하고 사용 사례 인터랙 a의 PROCESS_SHIPMENT 메소드를 호출하는 과정 발송 버튼을 클릭 할 UI
  9. 사용자에 표시됩니다. 유스 케이스 인터랙 터는 3 단계에서와 같이 선적 팩토리를 다시 호출해야합니까? 아니면 유스 인터랙 터가 3 단계에서 이미 생성 된 선적 객체의 인스턴스를 가져올 수 있습니까?

발송물 오브젝트의 상태가 UI 컨트롤러, 사용 사례 인터랙 터 또는 저장소에서 인스턴스 변수 여야합니까? 이상적으로는 어딘가에 저장하고 싶기 때문에 사용자가 UI에서 버튼을 클릭 할 때마다 새 객체를 생성 할 필요가 없습니다.

미리 감사드립니다.

답변

2

DDD 저장소를 상태 유지할 수 있습니까?

예 절대적 - 즉

저장소는 개념적으로하는 특정 유형의 모든 오브젝트를 나타내는 설명 원래의 포인트의 일부 (보통 에뮬레이트). 좀 더 정교한 쿼리 기능을 제외하고는 컬렉션처럼 작동합니다 .... 전역 액세스가 필요한 각 유형의 객체에 대해 해당 유형의 모든 객체의 메모리 컬렉션에 의 환상을 제공 할 수있는 객체를 만듭니다. 환언

는 점 컬렉션의 구현 세부 사항으로부터 애플리케이션 구성 요소를 분리한다. 앱에서 알 수있는 한 저장소는 메모리의 상태 저장 키/값 저장소로 구현할 수 있습니다.

이상적으로는 사용자가 UI의 버튼을 클릭 할 때마다 새 개체를 계속 만들 필요가 없기 때문에 어딘가에 저장하고 싶습니다.이해하기 쉬운 코드를 유지하는 문제로서

, 당신은 아마는 새로운 객체를 매번 생성하고, 당신이에 대한 명확한 비즈니스 사례가있는 경우에만 캐시의 합병증을 처리해야한다.

그런데 저장소의 구현에 최근에 사용한 개체의 캐시를 포함 할 수있는 이유는 없습니다. 캐시 무효화 전략에 기꺼이 투자해야합니다. 캐시 무효화 및 명명 것들 :

기억

는 필 Karlton는 컴퓨터 과학 단지 두 개의 하드 가지가 있습니다 년 전

우리를 가르쳤다.

+0

동의. 실제 * 저장소 구현에 캐싱이 포함되지 않아야 함을 추가하겠습니다. 오히려 * 데코레이터 패턴 *을 사용하여 캐싱을 포함시킵니다. 이 데코레이터는 실제 구현 (아마도 생성자 삽입)을 래핑 한 다음 캐싱을 수행합니다. 당신의 유스 케이스는 여전히'IShipmentRepository'를 필요로하지만 "래퍼"를 인스턴스화하고 저장소 인스턴스를 전달할 것이다. 이 방법으로 저장소를 깨끗하게 유지할 수 있습니다. –

0

이론적으로 그것은 항상 상태 유지입니다. 집계를로드/저장할 때 저장소에서 캐시를 사용할 수 있는지 묻는 중입니다. 다시 한 번 그렇습니다. 캐싱은 필요하지 않으면 피해야하는 복잡한 것입니다.

이 특별한 경우 캐시를 사용하면 응용 프로그램의 수평 확장성에 어려움이 있습니다. 여러 인스턴스를 갖는 것은 어렵습니다. 데이터베이스/지속성 레벨에서 낙관적 잠금을 사용하기가 어렵지만 집계를로드 할 때 집계의 버전을 올바르게 설정해야합니다. 그렇지 않으면 예상 버전 (로드 된 버전 + 1)이 일치하지 않습니다. 즉, @VoiceOfUnreason이 말했듯이 캐시를 효율적으로 무효화하는 것은 어렵습니다.

그렇다면 수평 확장 성을 느슨하게하고 yes를 선택하면 집계를 캐시 할 수 있습니다.

P. 이것은 Event sourced aggregate repositories에는 적용되지 않습니다. 이 경우 스냅 샷을 메모리에 보관할 수 있지만 이벤트 저장소를 터치하거나 쿼리하여 새 이벤트를 찾습니다.

+0

정보를 제공해 주셔서 감사합니다. 유스 케이스 인터랙 터에 객체를 저장하는 것이 옵션일까요? 아니면 깨끗한 건축 원칙을 어기 는가? –

+0

@ TonyRaimo 아무 것도 위반하지 않을 것입니다. 이 경우 Interactor는 캐시처럼 작동합니다. –

관련 문제