2013-09-26 3 views
0

새로운 시스템을 개발할 때 DDD를 사용하려고합니다. 이 시스템에는 장소가있어 회원이되어있는 광고 그룹을 기반으로 한 장소에 대한 액세스 권한을 부여해야합니다. 또한 광고 그룹 목록에서 허용되는 장소의 목록을 가져와야합니다.DDD. 엔티티 또는 서비스에 대한 메소드?

하는 나는 다음을 마련했습니다

interface IPlaceRepository 
{ 
    Places[] GetPlacesForGroups(AdGroup[] adGroups); 
} 

class AdGroup() 
{ 
    string Name { get; private set; } 
} 

class Place 
{ 
    string Name { get; private set; } 
} 

가 지금은 특정 위치에 그룹 액세스 권한을 부여하는 기능을 추가해야합니다. DDD에 따르면 올바른 방법은 무엇입니까? 두 가지 제안이 있습니다. 광고 그룹을 값 개체로 간주 할 수 있다고 가정합니다.

  1. 장소에 기능을 추가하십시오.

void GiveAccessTo(AdGroup adGroup) { ... }

및 IPlaceRepository에 기능을 추가한다.

void AddGroupToPlace(Place p, Group g) { ... } 

그러면 GiveAccessTo 내에서 사용할 수 있도록 IPlaceRepository를 삽입해야합니다.

  1. 또 다른 방법은 ISecurityService를 만드는 것입니다. 나는 그와 같은 방법을 그 봉사에서 생각할 수있다. 내가 IPlaceRepository의 메소드를 구현하고 서비스에 저장소를 주입해야하는 옵션 1과 동일한 방법으로

void GiveAccessToPlace(AdGroup g, Place p)

.

이 작업을 수행하는 DDD 방법은 무엇입니까?

+4

리포지토리에'AddXtoY()'메소드를 포함 할 필요가 없습니다. 집계의 모든 엔티티와 값 객체는 저장 될 때 루트와 함께 자동으로 유지됩니다 (일반적으로 UnitOfWork가 DB로 플러시 될 때). – guillaume31

답변

4

) 기본적으로 모두 거부 리포지토리는 완전한 집계를 유지하지만 일반적으로 AddGroupToPlace 메서드는 없습니다.

ADGroup은 값 개체이므로 GiveAccessTo 메서드를 사용하여 Place 집합에 그룹을 추가 할 수 있습니다.그런 다음 저장소를 사용하여 전체 Place 집합을 유지합니다.

서비스는 주로 작업이 여러 집계에 걸쳐있을 때 사용됩니다. 이것은 종종 이벤트를 사용하여 피할 수 있습니다.

0

(간접 답)

DDD는 당신의 사건을 위해 특별히 몇 가지 규칙이 있는지 확실하지. 나는 다음 단계를 수행합니다 : 종이 패드에

  • 그리기 (개체가 다른 하나를 포함하는)
  • 이 목록을 저장하는
  • 목록을 쿼리 몇 가지 방법을 그립니다 루트 집계에 관심을 집계, 허용 된 항목
  • 문서 지향 데이터베이스에 저장하는 방법 또는 다른 점 (구체화 된보기는 상황을 복잡하게 만들 수 있습니다)
  • 몇 가지 접근 방법이 유효 할 수 있으며 쿼리로 돌아가서 최상의 결과를 선택하십시오 접근 방식 (메모리 소비, 속도, 최소 num 조회 할 필요 항목) 비즈니스 API에서
  • 별도의 보안, 당신 만 화이트리스트 (목록 허용 된 모든 리소스를 사용
  • 를 사용하는 프레임 워크에서 사용 권한 부여 패턴의 BER은
관련 문제