Может ли бизнес-уровень одного модуля напрямую обращаться к репозиторию другого модуля?

У меня трехслойная архитектура.

1) Приложение С# MVC — уровень пользовательского интерфейса

2) Бизнес-уровень, состоящий из сервисных интерфейсов и интерфейсов его реализации и репозитория.

3) Уровень доступа к данным — состоит из реализации интерфейса репозитория.

Приложение разделено на разные модули. Модуль — это не что иное, как библиотека классов C#. Каждый модуль имеет собственный бизнес-уровень и уровень доступа к данным. Между уровнями существует слабая связь, поэтому каждый уровень получает доступ к другому только через интерфейс. В качестве примера, вот как устроено приложение.

// UI layer
public class UserController: Controller 
{
   IUserService userService;
   IOrderService orderService;

   public UserController(IUserService userService, IOrderService orderService){
     this.userService = userService;
     this.orderService  = orderService;
   }
}

//Business layer - User module
public class UserService: IUserService
{
   IUserRepository userRepository;
   IOrderRepository orderRepository;

   public UserService(IUserRepository userRepository, IOrderRepository 
   orderRepository){
      this.userRepository = userRepository;

      //Should this be here or replaced by order service ?
      this.orderRepository = orderRepository;
   }
}

//Business layer - Order module
public class OrderService: IOrderService
{
   IOrderRepository orderRepository;

   public UserService(IOrderRepository orderRepository){
      this.orderRepository= orderRepository;
   }
}

//Data access layer - User module

public class UserRepository: IUserRepository {
}

//Data access layer - Order module

public class OrderRepository: IOrderRepository {
}

Можно ли службе User напрямую обращаться к репозиторию Order или она должна зависеть только от службы Order?


person devanalyst    schedule 08.04.2017    source источник
comment
Лучше использовать сервис вместо репозитория, потому что у сервисов есть бизнес-логика, которую нужно выполнить перед выполнением любой операции с базой данных. Но вам нужно быть осторожным, чтобы обе службы не зависели друг от друга, иначе вы окажетесь в тупике.   -  person Chetan Ranpariya    schedule 08.04.2017


Ответы (1)


Вы обращаетесь к IOrderRepository в UserService. Ваш вопрос заключается в том, правильный ли это подход, или он должен ТОЛЬКО обращаться к IUserRepository и вызывать OrderService вместо IOrderRepository.

ИМО, любая служба может вызывать любой репозиторий по мере необходимости. Между Сервисом и Репозиторием нет отношения 1 <-> 1.

Репозиторий предоставляет вам доступ к данным. Если такой доступ необходим в нескольких службах, то несколько служб могут использовать один и тот же репозиторий. Это выглядит очень чистым и объяснимым.

person Amit Joshi    schedule 10.04.2017
comment
Спасибо за подробный ответ. Хотя у меня есть еще 1: можно ли обслуживать доступ как к репозиторию, так и к обслуживанию другого модуля? В моем случае, например, UsersService нужны и OrdersRepository, и OrdersService? Или это плохой запах? заранее спасибо - person MyTitle; 17.02.2020
comment
@MyTitle: IMO: 1) В случае многоуровневой архитектуры доступ к одной службе в другой не должен быть проблемой. Это действительно помогает повторно использовать код. Однако такое использование должно быть минимальным. 2) В случае с архитектурой DDD это определенно запах кода, потому что здесь доменные службы являются частью вашего связанного контекста. Если вам нужно получить доступ к другой службе в одной службе, возможно, вы плохо спроектировали связанный контекст. Лучшим решением здесь является использование событий домена или какого-либо другого инструмента, предоставляемого DDD. Надеюсь, это поможет. - person Amit Joshi; 17.02.2020