에 대한 힌트가 될 수 있다면
궁금하네요. 그러나 더 이상. 그 실체 관계의 종류를 명확히하기
더 나은 방법은 도메인 전문가에게 문의하는 것입니다
- 프로젝트 구성원이 프로젝트없이 어떤 의미가 있습니까?
- 회원이 여러 프로젝트에 참여할 수 있습니까?
긍정적으로 대답하면 프로젝트 구성원을 통합 루트로 모델링해야 할 가능성이 큽니다. 그렇지 않은 경우 프로젝트없이 승격 할 수없는 엔티티로 강등하십시오.
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...");
}
}
내가 귀하의 비즈니스에 대해 무엇의 약간의 지식을 가지고 유의 사항 : 여기
당신에게 몇 가지 아이디어를 줄 수있는 몇 가지 코드입니다. 이것은 즉흥적 일뿐입니다. :)
"프로젝트 회원이 프로젝트 없이는 어떤 의미가 있습니까?" ? 데이터베이스 레벨에서 작성된 관계가 있습니다. 따라서 모든 프로젝트 멤버는 부모 프로젝트 레코드를 가져야합니다. 또는 프로젝트 멤버에게 할당해야하는 TaskEntity가있는 상황을 의미 했습니까? 이 시나리오에서 프로젝트 구성원 엔티티는 프로젝트 없이도 될 수 있습니다. 그렇습니까? – user137348
@ user137348 모델링을 할 때 데이터베이스에 대해 생각하지 마십시오 (해당 레벨에서 확실히 관계가 있음). 응용 프로그램이 해결하려고하는 문제점의 종류에 대해 생각해보십시오. 그래서 ** 도메인 ** 구동이라고합니다. 회원이 독립적 일 필요가 없다면 엔티티입니다. 먼저 프로젝트를 생성하고 멤버를 할당합니다 (프로젝트 없이는 아무 의미가 없습니다). –
나는 본다. 그러나 타당성이 프로젝트 구성원 엔티티를 참조하는 경우 이는 구성원 엔티티 자체가 집합 적 루트이고 프로젝트의 일부가 아닌 것을 의미합니까? – user137348