1) Должен ли я создавать методы-оболочки в службе для этих вызовов репозитория?
В основном, да.Как правило, вы хотите предложить CRUD для моделей вашего домена на уровне обслуживания.Таким образом, контроллеру не нужно работать с репозиторием напрямую (фактически, он никогда не должен).Вы можете добавить более сложную логику позже без необходимости изменения внешнего кода.Например, рассмотрим, что вы хотели реализовать ленту новостей.Теперь каждый раз, когда вставляется пятиногое животное, вы хотите создать новость и передать ее любителям пятиногого животного.Другим распространенным примером являются уведомления по электронной почте.
2) Разве для меня не имеет смысла просто включать метод GetFiveLeggedAnimals и другую бизнес-логику в хранилище?
Businessлогика должна быть в Service Layer или в Domain Model самих объектах и только там.На самом деле (см. 3) я бы вообще не предлагал IAnimalRepository
, если это возможно.
Например, в среде NoSQL драйвер базы данных в значительной степени является хранилищем.С другой стороны, при использовании сложного отображения ORM и хранимых процедур (где часть логики biz находится в БД), у вас действительно нет выбора, но вы предлагаете явные интерфейсы, которые знают хранимые процедуры.
Я бы пошел на IRepository<T>
и использовал бы шаблон Query Object , если это возможно.Я думаю, что LINQ также можно рассматривать как Объект запроса / Шаблон репозитория .
3) Могу ли я реализовать интерфейс IAnimalsRepositoryв AnimalsService и затем вызывать базовые методы (я понимаю, что это возможно, но я предполагаю, что это плохая практика)?
Чтобы вызвать base методы, вам придется наследоватьот конкретной реализации, например, от ConcreteAnimalsRepository
.
Кроме того, если ваша служба прямо или косвенно реализует интерфейс IAnimalsRepository
, она делает (нефильтрованные) операции CRUD доступными для всех.
Мое заключение: Не наследуйте,совокупный .Сервисный уровень имеет хранилище, но он не является самим хранилищем: сервисный уровень обрабатывает всю дополнительную логику приложения (разрешения, уведомления), а хранилище является очень тонкой оболочкойвокруг слоя db.
В качестве крайнего примера, что, если удаление чего-либо напрямую было запрещено, и только сервису было бы разрешено использовать его при вставке более новой версии sth.?Это легко построить при агрегировании.