비즈니스 로직 위임과 캡슐화 사이의 경계를 어디에서 그릴까요? 우리가 더 많이 위임할수록 더 빈혈 이되는 것 같습니다 . 그러나 대표단은 또한 재사용과 DRY 교장을 장려합니다. 그렇다면 위임하는 것이 무엇이고 도메인 모델에 무엇이 남아 있어야합니까?
다음 우려 사항을 예로 들어보십시오.
승인 . 도메인 개체가 액세스 제어 규칙 (예 : CanEdit 속성)을 유지 관리해야합니까, 아니면 액세스 관리를 담당하는 다른 구성 요소 / 서비스 (예 : IAuthorizationService.CanEdit (object))에게 위임되어야합니까? 아니면 둘의 조합이어야합니까? 아마도 도메인 개체에 실제 작업을 수행하기 위해 내부 IAuthorizationService에 위임하는 CanEdit 속성이 있습니까?
검증 . 위와 동일한 설명은 유효성 검사와 관련이 있습니다. 누가 규칙을 유지하고 누가 평가할 책임이 있습니까? 한편으로 객체의 상태는 해당 객체에 속해야하며 유효성은 상태이지만 모든 도메인 객체의 규칙을 평가하는 데 사용되는 코드를 다시 작성하고 싶지는 않습니다. 우리는 수 ,이 경우 상속을 사용 ...
객체 생성 . 팩토리 클래스 대 팩토리 메소드 대 인스턴스 새로 만들기 별도의 팩토리 클래스를 사용하면 생성 로직을 분리하고 캡슐화 할 수 있지만 객체의 상태를 팩토리에 공개하지 않아도됩니다. 팩토리에서 사용하는 내부 생성자를 노출하여 도메인 계층이 별도의 어셈블리에있는 경우 관리 할 수 있지만 여러 생성 패턴이있는 경우 문제가됩니다. 그리고 모든 팩토리가 올바른 생성자를 호출하는 것이라면 팩토리를 갖는 것이 무엇입니까?
클래스의 팩토리 메소드는 객체의 내부 상태를 여는 데 따른 문제를 제거하지만 정적이기 때문에 별도의 팩토리 클래스를 사용하는 것처럼 팩토리 인터페이스를 주입하여 종속성을 깰 수 없습니다.
끈기 . 도메인 오브젝트가 CanEdit을 노출시키면서 권한 확인을 다른 당사자 (IAuthorizationService)에게 수행 할 책임을 위임하면서 왜 도메인 오브젝트에 동일한 방법을 수행하는 Save 메소드가 없는가? 이를 통해 객체의 내부 상태를 평가하여 캡슐화를 중단하지 않고 작업을 수행 할 수 있는지 확인할 수 있습니다. 물론 리포지토리 인스턴스를 도메인 객체에 주입해야합니다. 도메인 객체에 약간의 냄새가납니다. 대신 도메인 이벤트를 발생시키고 처리기가 지속성 작업을 수행하도록 허용합니까?
내가 어디로 가는지 보아?
Rockford Lhotka는 CSLA 프레임 워크에 대한 충전 클래스 경로를 사용해야하는 이유에 대해 큰 토론을하고 있으며 해당 프레임 워크에 대해 약간의 역사가 있으며 도메인 오브젝트를 병렬화하는 비즈니스 오브젝트에 대한 그의 아이디어를 여러 가지 방법으로 볼 수 있습니다. 그러나 좋은 DDD 이념에 더 충실하려고 노력할 때 협업이 과도해질 때 궁금합니다.
집계 루트에 대해 IAuthorizationService, IValidator, IFactory 및 IRepository로 끝나는 경우 남은 것은 무엇입니까? 클래스가 비 핵심 도메인 객체로 간주 될 수있을 정도로 객체의 상태를 초안에서 게시 됨으로 변경하는 Publish 메소드가 있습니까?
당신의 생각?