Скажем, у нас есть система регистрации задач, когда задача регистрируется, пользователь указывает категорию, и задача по умолчанию имеет статус «Не выполнено». Предположим, что в этом случае Category и Status должны быть реализованы как объекты. Обычно я бы сделал это:
Уровень приложений:
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;
}
}