Supongamos que tenemos un sistema de registro de tareas, cuando se registra una tarea, el usuario especifica una categoría y la tarea por defecto es un estado de "Excepcional". Suponga en este caso que la Categoría y el Estado deben implementarse como entidades. Normalmente haría esto:
Capa de aplicación:
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);
}
}
Entidad:
public class Task
{
//...
public static void Create(Category category, Status status, string description)
{
return new Task
{
Category = category,
Status = status,
Description = descrtiption
};
}
}
Lo hago así porque constantemente me dicen que las entidades no deberían acceder a los repositorios, pero tendría mucho más sentido para mí si hiciera esto:
Entidad:
public class Task
{
//...
public static void Create(Category category, string description)
{
return new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
}
}
El repositorio de estado es la dependencia inyectada de todos modos, por lo que no hay una dependencia real, y esto me parece más, ya que es el dominio el que está tomando la decisión de que una tarea predeterminada sea sobresaliente. La versión anterior se siente como si la capa de aplicación tomara esa decisión. ¿Por qué los contratos de repositorio a menudo están en el dominio si esto no debería ser una posibilidad?
Aquí hay un ejemplo más extremo, aquí el dominio decide la urgencia:
Entidad:
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;
}
}
No hay forma de que desee pasar en todas las versiones posibles de Urgencia, y no hay forma de que desee calcular esta lógica de negocios en la capa de aplicación, por lo que seguramente sería la forma más adecuada.
Entonces, ¿es esta una razón válida para acceder a los repositorios desde el dominio?
EDITAR: Este también podría ser el caso en los métodos no estáticos:
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;
}
}