Скажімо, у нас є система реєстрації завдань, коли завдання реєструється, користувач визначає категорію та завдання за замовчуванням до статусу "Видатний". Припустимо, що в цьому випадку категорія та статус мають бути реалізовані як сутності. Зазвичай я б це робив:
Шар програми:
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, і жодним чином ви не хотіли б обчислити цю ділову логіку на рівні додатків, так що, безумовно, це був би найбільш підходящий спосіб?
Отже, це поважна причина доступу до сховищ з домену?
EDIT: Це може бути й у випадку нестатичних методів:
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;
}
}