2011-01-06 3 views
1

내 프레젠테이션 레이어가 어떻게 구조화되어 있는지가 내 집계 루트를 디자인하는 데 도움이되는지 궁금합니다. (: M 1) 페이지로 구성된다집계 루트 디자인 및 프레젠테이션 레이어

는 다음과

페이지의 상단 ProjectEntity

하는 형태 밑에서

이다

엔티티 ProjectEntity과 관련 엔티티 ProjectMemberEntity가 있습니다 양식은 ProjectMemberEntity의 목록을 보여주는 표입니다.

새 ProjectMember가 추가되면 사용자는이 페이지로 이동하여 grid.also의 머리글에있는 "새 구성원 추가"버튼을 클릭해야합니다. 편집 및 삭제도 같은 비유가 있습니다. 이 동작/'페이지 구조'는 집계 루트 (projectentity) 확실히 힌트를의

답변

1

에 대한 힌트가 될 수 있다면

궁금하네요. 그러나 더 이상. 그 실체 관계의 종류를 명확히하기

더 나은 방법은 도메인 전문가에게 문의하는 것입니다

  • 프로젝트 구성원이 프로젝트없이 어떤 의미가 있습니까?
  • 회원이 여러 프로젝트에 참여할 수 있습니까?

긍정적으로 대답하면 프로젝트 구성원을 통합 루트로 모델링해야 할 가능성이 큽니다. 그렇지 않은 경우 프로젝트없이 승격 할 수없는 엔티티로 강등하십시오.

public class Project:Root{ 
private List _members; 
public IEnumerable<Member> Members{get {return _members;}} 
public string Name{get;private set;} 
public bool IsFinished{get;private set;} 
public bool FinishedOn{get;private set;} 
public Project(string projectName){ 
    _members=new List<Member>(); 
    Name=projectName; 
} 
public Member AssignMember(string memberName){ 
    var member=new Member(memberName); 
    _members.Add(member); 
    return member; 
} 
public void UnassignMember(string memberName){ 
    var member=_members.First(m=>m.Name==memberName); 
    if(!member.HasCompletedAllTasks()) 
    throw new Exception 
    ("Cannot unassign member with incompleted tasks!"); 
    _members.Remove(member); 
} 
public void AssignTaskToMember(string taskName, string memberName){ 
    var member=_members.First(m=>m.Name==memberName); 
    member.AssignTask(taskName); 
} 
public void MemberHasCompletedTask(Member member, Task task){ 
    EnsureListContains(_members,member); 
    EnsureListContains(member.Tasks,task); 
    task.MarkAsCompleted(); 
}  
public void FinishProject(){ 
    if(_members.Any(m=>!m.HasCompletedAllTasks())) 
    throw new Exception 
    ("Can't finish project before members have completed all their tasks."); 
    IsFinished=true; 
    FinishedOn=DateTime.Now; 
} 
private void EnsureListContains<T>(IList<T> lst, T itm){ 
    if(!lst.Contains(itm)) throw new Exception(); 
} 
} 

public class Member:Entity{ 
public string Name{get;private set;} 
private List<Task> _tasks; 
public IEnumerable<Task> Tasks{get{return _tasks;}} 
internal Member(string memberName){ 
    Name=name; 
    _tasks=new List<Task>(); 
} 
internal void AssignTask(string taskName){ 
    _tasks.Add(new Task(taskName)); 
} 
public bool HasCompletedAllTasks(){ 
    return _tasks.All(t=>t.IsCompleted); 
} 
public Task GetNextAssignedTask(){ 
    return _tasks.Where(t=>!t.IsCompleted) 
    .OrderBy(t=>t.AssignedOn).First(); 
} 
} 

public class Task:Entity{ 
public string Name{get; private set;} 
public bool IsCompleted{get; private set;} 
public DateTime CompletedOn{get; private set;}  
public DateTime AssignedOn{get; private set;} 
internal Task(string name){ 
    Name=name; 
    AssignedOn=DateTime.Now; 
} 
internal void MarkAsCompleted(){ 
    if(IsCompleted) throw new Exception 
    ("Task is already completed!"); 
    IsCompleted=true; 
    CompletedOn=DateTime.Now; 
} 
} 

public class App{ 
public static void Main(){ 
    var project=new Project 
    ("Question: Aggregate root design and presentation layer"); 
    var me=project.AssignMember("Arnis Lapsa"); 
    project.AssignTaskToMember("Try to help user137348","Lapsa"); 
    var currentTask=me.GetNextAssignedTask(); 
    //SpamStackOverflow(); 
    project.MemberHasCompletedTask(me,currentTask); 
    if(me.HasCompletedAllTasks()) project.Finish(); 
    else throw new Exception("Enough for today..."); 
} 
} 

내가 귀하의 비즈니스에 대해 무엇의 약간의 지식을 가지고 유의 사항 : 여기


당신에게 몇 가지 아이디어를 줄 수있는 몇 가지 코드입니다. 이것은 즉흥적 일뿐입니다. :)

+0

"프로젝트 회원이 프로젝트 없이는 어떤 의미가 있습니까?" ? 데이터베이스 레벨에서 작성된 관계가 있습니다. 따라서 모든 프로젝트 멤버는 부모 프로젝트 레코드를 가져야합니다. 또는 프로젝트 멤버에게 할당해야하는 TaskEntity가있는 상황을 의미 했습니까? 이 시나리오에서 프로젝트 구성원 엔티티는 프로젝트 없이도 될 수 있습니다. 그렇습니까? – user137348

+1

@ user137348 모델링을 할 때 데이터베이스에 대해 생각하지 마십시오 (해당 레벨에서 확실히 관계가 있음). 응용 프로그램이 해결하려고하는 문제점의 종류에 대해 생각해보십시오. 그래서 ** 도메인 ** 구동이라고합니다. 회원이 독립적 일 필요가 없다면 엔티티입니다. 먼저 프로젝트를 생성하고 멤버를 할당합니다 (프로젝트 없이는 아무 의미가 없습니다). –

+0

나는 본다. 그러나 타당성이 프로젝트 구성원 엔티티를 참조하는 경우 이는 구성원 엔티티 자체가 집합 적 루트이고 프로젝트의 일부가 아닌 것을 의미합니까? – user137348

0

DDD의 경우 도메인 및 집계를 디자인 할 때 분석 마비가 발생하지 않도록하십시오. 그것은 나에게 일어났다. 내 집계를 똑바로 가져올 수 없기 때문에 내 프로젝트는 한 달 동안 문자 그대로 중단되었습니다. 그리고 난 간단한 3 데이터베이스 테이블 상황에 대해 이야기하고 있습니다. 사용자, 주소 및 사용자 프로필.

DDD의 것은 올바른 일을 한 것과 같은 것이 없다는 것입니다. 같은 질문을 서로 3 개월 간격으로 게시하면 각 질문마다 완전히 다른 답변을 제공하는 "전문가"가됩니다. Amis L.는 당신에게 솔리드 한 간단한 예를 보여줄 정도로 친절했습니다. 대부분의 사람들은 에릭의 책에서 복사하여 붙여 넣습니다.

무엇이든 보트를 띄우십시오. 하루가 끝나면 도메인을 수작업으로 만들지 않더라도 결코 커뮤니티에 적합하지 않습니다. 차게하고 코딩을 즐기십시오.

관련 문제