Недавно я изо всех сил пытался выяснить, были ли некоторые методы и функции в моей архитектуре на своем месте; в правильном слое. Я хочу следовать шаблону репозитория Мартина Фаулера, чтобы отделить мой уровень обслуживания от базы данных.
Определение, объясненное Мартином Фаулером на его веб-сайте, гласит:
Репозиторий является посредником между уровнями отображения домена и данных, действуя как коллекция объектов домена в памяти.
Проблема в том, что у меня много требований, по которым я должен, например, получить сумму всех счетов. Как вы понимаете, сумма всех счетов - это скалярная величина. Если я следую определению Мартина Фаулера, то что мне нужно сделать, так это создать функцию, которая возвращает список объектов домена из моего уровня репозитория, который получает уровень сервиса, который циклически выбрасывает объекты для вычисления итога. Также возможно, что я не понимаю сути того, что означает этот паттерн ...
Я знаю, что производительность не должна быть проблемой при разработке приложения, потому что ремонтопригодность лучше, но в этом случае, на мой взгляд, полная трата времени на разработку и производительность не создавать функцию в репозитории слой, который возвращает десятичное значение, соответствующее общей сумме счетов-фактур, и возвращает это же значение из уровня обслуживания. Материализовать список объектов и затем просто использовать одно свойство - излишество, даже если вы можете добавить некоторую стратегию ленивой загрузки с помощью ORM.
Правильно ли возвращать скалярное значение из уровня репозитория или я должен сопротивляться искушению и всегда возвращать объект (ы) домена с этого уровня и обрабатывать всю бизнес-логику на уровне обслуживания?
У меня также есть много мест, где мои докладчики вызывают непосредственно мой репозиторий вместо вызова уровня обслуживания, который затем вызывает уровень репозитория. Это верно; Допустимо называть этот шаблон репозитория вне уровня сервиса?
Обратите внимание, что я не хочу возвращать результат IQueryable из моего уровня репозитория, потому что это будет полностью противоречить Закон Деметры.
Кроме того, я не хочу устанавливать запрос непосредственно на моем уровне обслуживания, потому что я хочу иметь возможность полностью модульное тестирование этого уровня; не проводил интеграционный тест.