Я заранее извиняюсь, если люди считают, что это было избито до смерти. Я только что провел последние несколько часов в поиске и чтении многих замечательных сообщений здесь, в SO, но я все еще смущен.
Источником моей путаницы является DTO и DDD и репозитории. Я хочу, чтобы у моих объектов домена POCO были умны, и я хочу получить их из репозиториев. Но мне кажется, что я должен нарушать некоторые правила инкапсуляции, чтобы сделать эту работу, и похоже, что она может превратить DTO в их головы.
Вот простой пример: В нашем приложении каталога часть может быть пакетом, который включает в себя ряд других частей. Таким образом, для Part POCO имеет смысл использовать метод GetChildren(), который возвращает IEnumerable < Часть > . Это может даже сделать другие вещи со списком на выходе.
Но как этот список разрешен? Похоже, репозиторий - это ответ:
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 потреблял Part, а не наоборот.
Это уже слишком долго. Где моя голова отвинчена?