Я заранее извиняюсь, если люди думают, что это было избито до смерти. Я только что провел последние несколько часов, ища и читая много отличных сообщений здесь, в SO, но я все еще в замешательстве.
Источником моего замешательства является DTO против DDD и репозиториев. Я хочу, чтобы мои объекты домена POCO обладали интеллектом, и я хочу получать их из репозиториев. Но мне кажется, что я должен нарушить некоторые правила инкапсуляции, чтобы это сработало, и кажется, что это может перевернуть DTO с ног на голову.
Вот простой пример: в нашем приложении-каталоге часть может быть пакетом, включающим ряд других частей. Таким образом, для Part POCO имеет смысл иметь метод GetChildren(), который возвращает IEnumerable‹ Part >. Он может даже делать другие вещи со списком на выходе.
Но как решить этот список? Похоже, репозиторий - это ответ:
interface IPartRepository : IRepository<Part>
{
// Part LoadByID(int id); comes from IRepository<Part>
IEnumerable<Part> GetChildren(Part part);
}
И
class Part
{
...
public IEnumerable<Part> GetChildren()
{
// Might manipulate this list on the way out!
return partRepository.GetChildren(this);
}
}
Итак, теперь потребители моего каталога, в дополнение к (правильной) загрузке частей из репозитория, также могут обойти некоторую логику, инкапсулированную в часть, путем прямого вызова GetChildren(part). Разве это не плохо?
Я читал, что репозитории должны обслуживать POCO, но DTO хороши для передачи данных «между слоями». Вычисляются многие свойства деталей — например, цены рассчитываются на основе сложных правил ценообразования. Цена даже не будет находиться в DTO, поступающем из репозитория, поэтому похоже, что передача данных о ценах обратно в веб-службу требует, чтобы DTO использовал часть, а не наоборот.
Это уже становится слишком долго. Где моя голова отвинчена?