2011-03-06 2 views
1

DDD에 대해 알아 보려면 http://code.google.com/p/ndddsample에서 훌륭한 NDDDSample 소스를 찾고 있습니다. 뭔가 혼란 스러워요DDD 샘플 : CargoRepository.Store()를 컨트롤러에 사용할 수 있습니까?

CargoRepository는 BookingService.AssignCargoToRoute()와 CargoTrackingController.Search (에 의해 호출되는 찾기() 메소드)가 있습니다

Cargo cargo = CargoRepository.Find(trackingId); 

CargoRepository도 BookingService에서 호출 스토어() 메소드가를 .AssignCargoToRoute() :

Cargo cargo = cargoRepository.Find(trackingId); 
if (cargo == null) 
{ 
    throw new ArgumentException("Can't assign itinerary to non-existing cargo " + trackingId); 
} 

cargo.AssignToRoute(itinerary); 
cargoRepository.Store(cargo); 

내 혼란은 BookingService.AssignCargoTo에서 비즈니스 로직을 우회 할 CargoRepository.Store()를 호출에서 CargoTrackingController을 중지 아무것도 없을 것 같다이다 경로()

DDD에서 허용되는 이유는 무엇입니까? 저장소를 두 개로 분할해야 하나는 응용 프로그램/ui/domain/service에 대한 읽기 용이고 하나는 도메인/서비스 용 쓰기 용입니다.

답변

2

DDD에서 서비스는 모든 비즈니스 로직의 소유자가 아닙니다. 그것들은 여러 객체에 대한 교차 관심사 인 도메인의 동사를 나타낼 뿐이므로 단일 책임 원칙을 어 기지 않고 실체를 혼란스럽게하는 꽉 조이는 연결 고리를 만들지 않고 엔티티 중 하나 또는 집계 루트에 맞지 않습니다.

예에서 Cargo.AssignToRoute (여정) 및 BookingService.AssignCargoToRoute()는 중복 된 것처럼 보입니다. 화물을 길에 묶는이 두 가지 방법의 존재는 혼란을 야기합니다. 자신에게 경로를 지정하는 것이화물의 책임이라고 생각하는지 또는화물에 속하지 않는 기능으로 엔티티를 오버로드하는지 여부에 따라 그 중 하나를 유지할 수 있습니다.

그 외에도 컨트롤러가 리포지토리 메서드를 직접 호출하는 것은 완전히 합법적입니다. 서비스는 컨트롤러에 대한 단일 액세스 지점이 아닙니다.

+0

도메인 객체를 잘못된 방식으로보고 있습니다. 나는 OEntity를 호출 할 것이라고 생각 했었습니다 .OEntity.DoSomething (x)를 호출 한 다음 oEntity.Save()를 호출했습니다.하지만 이것은 단일 책임 원칙을 잘못 위반하는 엔티티에 대한 지속성의 책임을 나쁘게 만듭니다. 엔터티는 자체적으로 작동하는 메서드 만 가지고 있어야하며 여러 엔터티가 단일 비즈니스 프로세스에 관련되는 경우 서비스가 만들어집니다. 나는 지금 감사의 이해를 더 얻고있다. 재미있는 물건, 고마워. –

1

글쎄, CQRS가 달성하려고하는 것 같아.

물론이 경우 BL을 우회하는 것은 나쁜 생각입니다. (분명히 달성하기가 아주 쉽습니다. 하지만 코드에서 모든 규칙을 시행 할 수는 없으며 일부 규칙은 코드에서 명시 적으로 선언되지 않은 규칙을 유지합니다. 어떤 나쁜 것들은 어려울 수도 있지만 여전히 달성하기가 불가능하지는 않습니다. 항상 바보 같은 실수가 많이 있습니다. 프로그래밍이란 바로 당신이 실제로하고있는 일을 생각해야합니다. 그렇지 않으면 DDD 같은 가이드 라인이 도움이되지 않습니다.

+0

아마도 나는 DDD를 너무 많이 읽고 있으며, 가이드 라인을 채택 할뿐 아니라 상식을 신뢰해야합니다. 여기서는 저장소 인터페이스를 두 개 (ICargoRepositoryRead 및 ICargoRepositoryUpdate)로 나누고 컨트롤러에 ICargoRepositoryRead 인터페이스에 대한 액세스 권한을 부여합니다. –

1

개발자가 이해하기 쉽고 유지하기 쉬운 구조를 유지하는 데 도움이되도록 영구 보관 서비스 및 서비스 요청에서 응용 프로그램을 분리해야합니다. 개발자는 일부 패턴을 따르고 코드를 올바르게 사용해야합니다.

개발자 (개발자)가 잘못 사용하는 것을 제한하는 프레임 워크가 아니며 DDD는 디자인 패턴 (응용 프로그램 구조를 구성하는 방법)입니다.

+0

감사합니다. DDD가 설계 용 프레임 워크라는 것을 알았습니다.그래서이 경우 컨트롤러의 클라이언트 코드가 가능한 한 많은 피해를 야기한다고 가정해야합니다. 따라서이 DDD 샘플이 수행하더라도 업데이트 기능이있는 저장소를 제공하지 않습니다. –

+0

@Gareth : 서비스 요청은 다음과 같습니다. (예 : .NET의 WCF를 사용하여) 서비스를 기반으로하는 웹 서비스를 만드는 클라이언트가 소비하는 외부 서비스에 대해 내부적으로 사용되며 클라이언트가 서비스에 어떤 메소드를 사용하는지 정의하고 사용 권한을 제어합니다 (권한 부여). –

관련 문제