Во-первых, я хотел бы опровергнуть ваше предположение, что каждому объекту нужен свой собственный репозиторий.Пер, Эрик Эванс, «Доменно-управляемый дизайн»
Хранилища предоставляют доступ к выбранным совокупным корням.Репозитории запрещены изнутри совокупности.
Учитывая ваш пример, у собаки есть ряд приемов, которые она выучила.Если вы хотите добавить новый трюк к собаке, вы должны сделать что-то вроде этого:
var dog = dogRepository.Get(dogId);
dog.Tricks.Add(newTrick);
dogRepository.SaveOrUpdate(dog);
Когда мне нужен новый метод Application Services, который использует комбинацию репозиториев, которые я не используюпока нет,
Я не уверен, что вы подразумеваете под этим.Но я думаю, что если вы будете использовать репозитории для агрегатных корней, вы не столкнетесь с таким грязным кодом.
Другая альтернатива, похоже, состоит в том, чтобы позволить слою Application Services играть только сРепозитории, но затем вы получаете много стандартного кода, добавляемого к службам приложений для выполнения очень простых задач.
Контроллеры контролируют.Думайте о контроллерах как о части пользовательского интерфейса, они перемещают вас от страницы к странице.Я признаю, что для простых вещей кажется проще внедрить репозиторий в контроллер, но когда ваш проект растет, разделение очень поможет, особенно если вы в конечном итоге получите еще один хук приложения на свой уровень задач.Храните репозитории вне контроллеров.
Например, у вас есть много классов, которые выполняют только одну задачу каждый?Или вы объединяете связанные задачи вдоль линий сущностей?Как вы справляетесь с задачами, которые требуют много репозиториев?Означает ли необходимость в большом количестве репозиториев для задания время, чтобы вернуться к чертежной доске?
Опять же, я думаю, что это восходит к определению совокупных корней.Наличие 4-5 репозиториев в задаче не так уж сложно.Я обычно организую свои задачи по тому, что пытается сделать приложение, с мыслью, что если пользовательский интерфейс изменится, скажем, на внешний JSON-запрос, вам просто нужно вызвать правильную задачу.
Надеюсь, что это ответит на вашвопрос.Не стесняйтесь публиковать это в списке рассылки Sharp, вы можете получить лучший ответ там.
Редактировать на основе комментариев:
Посмотрите, кто может мне помочь (https://github.com/sharparchitecture/Who-Can-Help-Me) для примеракак использовать слой ApplicationServices / Tasks. У них довольно маленькая модель предметной области, поэтому у каждого объекта есть своя задача.
Я думаю, что вы немного путаете терминологию, или, возможно, я неясен. ИдеяЗа уровнем ApplicationServices лежит дальнейшее абстрагирование пользовательского интерфейса от уровня домена. Репозитории являются объектами уровня домена, и знания о них не должны находиться в контроллере. Если вы в конечном итоге поменяли ORM или даже перешли на систему хранения на основе документов,вы поймете, почему эта абстракция делает ее действительно удобной, вам просто нужно убедиться, что ваши контракты ApplicationServices работают и не нужно портить контроллеры.
Но не путайте необходимость вApplicationServices как способ проверки будущего. Он просто обеспечивает дальнейшее разделение между вашими клиентами.и разделение почти всегда хорошо.
Опять же, для проекта, над которым вы работаете в одиночку, все это может показаться излишним.Когда вы работаете с другими разработчиками, вся эта абстракция действительно хороша.У вас может быть команда, работающая над проблемами домена верхнего уровня, и команда, работающая над уровнем представления, и у вас будет хорошее разделение интересов.