В приложении, использующем шаблон репозиториев и сервисов, как убедиться, что сервисный уровень всегда вызывается, а не репозитории напрямую?Консоль хранилища/услуг и согласованность данных
Пример:
class OrderRepository
{
void CreateOrder(Order o)
...
}
class OrderService
{
void CreateOrder(Order o)
{
//make some business logic tests
...
//call repository
_orderRepository.CreateOrder(o);
}
}
Я вижу две проблемы:
Программист может вызвать хранилищу напрямую, потому что он не знает о существовании службы (иногда его не так просто как в этом примере (1 сервис = 1 репозиторий с одинаковыми именами методов). Некоторые приложения не очень хорошо документированы, или кто-то в спешке может забыть проверить, существует ли соответствующая служба (ошибка)).
Совершенно иная: давным-давно кто-то создал несколько представлений + контроллеры, которые используют репозиторий заказов напрямую. В то время не было необходимости в проверке бизнес-логики или дополнительных операций, существует только репозиторий заказов (потому что там вообще не было необходимости). Если позже потребуется несколько дополнительных операций при создании заказа, будет создана служба. проблема в том, что все контроллеры, которые делают вызовы старых репозиториев, должны быть изменены. Не является ли принцип/идея репозитория (и разделение кода в слоях), чтобы сделать части независимыми друг от друга?
«... предполагается, что части независимы друг от друга?» Это неверное истолкование. Это означает, что * обязанности * независимы друг от друга. 'OrderRepository' остается ответственным за выборку данных и сохранение данных в базу данных и' OrderService' для применения логики управления заказами. Постарайтесь сделать эти обязанности более ясными, улучшив имена методов. 'SaveOrder' вместо' CreateOrder' для 'OrderRepository' является одним из способов. –