2016-09-23 5 views
2

우리는 HR 관련 응용 프로그램 구축을 위해 노력하고 있다고 생각하십시오. 여기서 부서 및 직원에 대한 도메인 개체를 모델링해야합니다. 도메인 개체를 중첩 된 집계로 모델링해야하는지, 특히 중첩되어 있는지에 대해 궁금합니다.DDD에서 도메인 객체 모델링보다 나은 것은 어느 것입니까?

나는 두 개의 서로 다른 스타일을 다음과 같이 고려하기 위해 노력하고있어 :

솔루션 # 01, 중첩 된 골재와 모델 직원.

var emp = empRepository.Get(1); 
// dot accessors 
var numberOfPeople = emp.Supervisor.ManagedStaffs[0].ManagedStaffs.Count; 

솔루션 # 2 중첩 집계가없는 모델 직원 :

public class Employee : BusinessObject, IEmployee 
{ 
    IList<IEmployee> ManagedStaffs { get; set;} 
    IEmployee Supervisor { get; set;} 
} 

그래서 우리는로 사용할 수 있습니다.

public class Employee : BusinessObject, IEmployee 
{ 
    //without nested aggregate 
} 

public class Supervisor : Employee, ISupervisor 
{ 
    IList<IEmployee> ManagedStaffs { get; set; } 
} 

그래서 우리는로 사용할 수 있습니다 : 우리는 ORM없이 도메인 객체를 지속성하려면

var emp1 = empRepository.Get(1); 
// GetManagedStaffs needs a parameter which is a ISupervisor 
var empList1 = empRepository.GetManagedStaffs(emp1.Supervisor); 
var empList2 = empRepository.GetManagedStaffs(empList[0]); 
var numberOfPeople = empList2.Count; 

, 순수한 ADO.NET은 솔루션 # 2는 훨씬 더 보인다.

솔루션 # 1에서 도트 접근자를 사용하려면 투명 ORM 프레임 워크를 도입해야하며 재귀 적으로 중첩 된 집계로 인해 지연로드가 환영됩니다.

여기서 중요한 점은 중첩 된 집계를 처리하는 방법에 따라 어느 것이 더 나은 솔루션인지 판단하는 것입니다.

의견을 제출해 주시겠습니까? 또는 뭔가를 바로 잡아야합니까?

감사합니다.

답변

3

두 번째 솔루션이 훨씬 좋습니다.

처음에는 응집체가 작아야합니다. 일반적으로 모든 작업에 모든 집계 구성 요소가 필요하지는 않습니다. 집계가 커질 경우 (모든 집계가 메모리에로드 될 때 집계에 대한 지속성 로직을 구현하는 것이 더 어려울 것입니다. 데이터베이스에 대한 쿼리는 더욱 복잡해집니다 (지속성 작업은 대형 집계에 큰 성능 영향을 미칩니다). ORM의 지연로드 기능을 통해 이러한 영향을 완화하고자하지만 지연로드는 더 많은주의와 제어가 필요합니다. 무엇이 언제로드되는지 정확히 알아야합니다. 또한 성능의 관점에서 보면, 단일 쿼리로 모든 집계를로드하는 것이 지연로드와 같은 여러 쿼리보다 더 낫습니다.

둘째, 첫 번째 시나리오의 사용은 Demeter Law (https://en.wikipedia.org/wiki/Law_of_Demeter)을 위반합니다. 이 시점에서 # 2 시나리오 사용법은 더 깨끗합니다.

+0

LoD를 이해하는 것은 정말 도움이됩니다. 전에 핵심 개념을 놓친 상태에서 <% # foo.bar.bla.bla.SomePropertyOrCollection %>과 같은 그램 수준 설탕을 프로그래밍하는 데이터 바인딩을위한 편리한 방법입니다. –

+0

다음은 LoD에 대한 유용한 기사입니다. http://haacked.com/archive/2009/07/14/law-of-demeter-dot-counting.aspx/ 또한 도메인 개체와 뷰 모델간에 차이점이 있습니다. 뷰 모델은 다른 객체와 상호 작용하지 않으므로 데이터 표현에만 사용됩니다.LoD는 객체가 서로 상호 작용할 때 중요합니다. – eternity

0

# 해결책 2가 좋습니다. 상사와 직원 사이에는 좋은 "is-a"관계가 있습니다. 그러나이 관계는 앞으로 커플 링 문제를 야기 할 것입니다. 당신은 직원을 바꿉니다. 나는 두려운 감독자가 또한 영향을받을 것이라고 생각합니다. 또 다른 해결책은 "상속을 통한 구성"과 # 1 솔루션의 구성을 선호하는 것일 수 있습니다. 결정은 당신의 것입니다

관련 문제