작업 기록 시스템이 있다고 가정하면, 작업이 기록 될 때 사용자는 범주를 지정하고 기본적으로 작업 상태는 'Outstanding'입니다. 이 경우 카테고리 및 상태가 엔티티로 구현되어야한다고 가정하십시오. 일반적으로 나는 이것을 할 것입니다 :
응용 프로그램 계층 :
public class TaskService
{
//...
public void Add(Guid categoryId, string description)
{
var category = _categoryRepository.GetById(categoryId);
var status = _statusRepository.GetById(Constants.Status.OutstandingId);
var task = Task.Create(category, status, description);
_taskRepository.Save(task);
}
}
실재:
public class Task
{
//...
public static void Create(Category category, Status status, string description)
{
return new Task
{
Category = category,
Status = status,
Description = descrtiption
};
}
}
나는 엔티티가 저장소에 액세스해서는 안된다는 말을 지속적으로 듣고 있기 때문에 이렇게합니다.하지만 이렇게하면 나에게 훨씬 더 합리적입니다.
실재:
public class Task
{
//...
public static void Create(Category category, string description)
{
return new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
}
}
어쨌든 상태 저장소는 의존성 주입이므로 실제 의존성은 없으며, 이것이 작업이 기본적으로 미해결 상태라고 결정하는 도메인이라는 사실을 느끼게됩니다. 이전 버전은 해당 결정을 내리는 응용 프로그램 관리자 인 것 같습니다. 이것이 가능하지 않은 경우 왜 리포지토리 계약이 도메인에서 자주 발생합니까?
다음은 도메인이 긴급 성을 결정하는 가장 극단적 인 예입니다.
실재:
public class Task
{
//...
public static void Create(Category category, string description)
{
var task = new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
if(someCondition)
{
if(someValue > anotherValue)
{
task.Urgency = _urgencyRepository.GetById
(Constants.Urgency.UrgentId);
}
else
{
task.Urgency = _urgencyRepository.GetById
(Constants.Urgency.SemiUrgentId);
}
}
else
{
task.Urgency = _urgencyRepository.GetById
(Constants.Urgency.NotId);
}
return task;
}
}
가능한 모든 버전의 Urgency를 전달할 방법이 없으며 애플리케이션 계층에서이 비즈니스 로직을 계산할 방법이 없으므로 이것이 가장 적합한 방법일까요?
이것이 도메인에서 리포지토리에 액세스하는 유효한 이유입니까?
편집 : 이것은 정적이 아닌 메소드의 경우에도 해당됩니다.
public class Task
{
//...
public void Update(Category category, string description)
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
if(someCondition)
{
if(someValue > anotherValue)
{
Urgency = _urgencyRepository.GetById
(Constants.Urgency.UrgentId);
}
else
{
Urgency = _urgencyRepository.GetById
(Constants.Urgency.SemiUrgentId);
}
}
else
{
Urgency = _urgencyRepository.GetById
(Constants.Urgency.NotId);
}
return task;
}
}