Архитектура лука: интерфейсы и реализация бизнес-услуг

Я изучаю луковую архитектуру. У меня есть путаница в отношении уровня сервиса, потому что я вижу, что некоторые люди говорят, что основной слой должен содержать только:

  • Модели
  • Интерфейсы репозитория
  • Интерфейсы служб

Но другие говорят, что он также должен реализовывать интерфейсы служб. Итак, какой слой должен реализовывать интерфейсы служб?

Я думал, что инфраструктурный уровень должен реализовать:

  • Интерфейсы репозитория
  • Интерфейсы служб

И добавьте их на уровень пользовательского интерфейса и тестовый уровень по запросу.

Спасибо!

Ответ 1

Основной слой должен содержать:

  • Модели/объекты/POCOs/Whatever_the_name... все о объектах домена
  • ВСЕ интерфейсы (включая репозитории и службы)
  • Реализация основных бизнес-сервисов (*)

(*) Если ваша компания занимается обработкой заказов, то реализация вашего IWorkOrderService должна быть в основном уровне. Если ваш WorkOrderService должен получить доступ, скажем, ShippingService (который не является вашей компанией), тогда он будет манипулировать только IShippingService, определенным на базовом уровне, а реализация IShippingService будет находиться где-то на уровне инфраструктуры.

Если ваш WorkOrderService нуждается в OrderRepository, это будет сделано точно так же.

Вот пример кода:

namespace MyBusiness.Core.Services
{
  internal class WorkOrderService: IWorkOrderService
  {
    public WorkOrderService(IOrderRepository orderRepository, IShippingService shippingService)
    {
      _orderRepository = orderRepository;
      _shippingService = shippingService;
    }

    ...
  }
}

Это будет до самого внешнего слоя вашей архитектуры лука - уровня разрешения зависимостей - чтобы связать все ваши интерфейсы с правильной реализацией службы во время выполнения.

For<IWorkOrderService>().Use<Core.Services.WorkOrderService>();
For<IShippingService>().Use<Infrastructure.Services.ShippingService>();
For<IOrderRepository>().Use<Infrastructure.Data.OrderRepository>();