Angenommen, wir haben ein Aufgabenprotokollierungssystem. Wenn eine Aufgabe protokolliert wird, gibt der Benutzer eine Kategorie an und die Aufgabe hat standardmäßig den Status "Ausstehend". Angenommen, in diesem Fall müssen Kategorie und Status als Entitäten implementiert werden. Normalerweise würde ich das machen:
Anwendungsschicht:
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);
}
}
Entität:
public class Task
{
//...
public static void Create(Category category, Status status, string description)
{
return new Task
{
Category = category,
Status = status,
Description = descrtiption
};
}
}
Ich mache das so, weil mir durchweg gesagt wird, dass Entities nicht auf die Repositories zugreifen sollen, aber es würde für mich viel sinnvoller sein, wenn ich das mache:
Entität:
public class Task
{
//...
public static void Create(Category category, string description)
{
return new Task
{
Category = category,
Status = _statusRepository.GetById(Constants.Status.OutstandingId),
Description = descrtiption
};
}
}
Das Status-Repository ist ohnehin von Abhängigkeiten abhängig, es besteht also keine wirkliche Abhängigkeit, und dies erscheint mir eher so, als ob es die Domäne ist, die die Entscheidung trifft, für die eine Aufgabe standardmäßig ausstehend ist. Die vorherige Version scheint der Antragsteller zu sein, der diese Entscheidung trifft. Warum sind Repository-Verträge oft in der Domain, wenn dies keine Möglichkeit sein sollte?
Hier ist ein extremeres Beispiel, hier entscheidet die Domain über die Dringlichkeit:
Entität:
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;
}
}
Es gibt keine Möglichkeit, alle möglichen Versionen von Dringlichkeit zu übergeben, und es gibt keine Möglichkeit, diese Geschäftslogik in der Anwendungsebene zu berechnen. Dies ist also mit Sicherheit die am besten geeignete Methode.
Ist dies also ein triftiger Grund für den Zugriff auf Repositorys von der Domäne aus?
EDIT: Dies könnte auch bei nicht statischen Methoden der Fall sein:
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;
}
}