Onion Architecture: интерфейсы и реализация бизнес-сервисов

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

  • модели
  • Интерфейсы репозитория
  • Сервисные интерфейсы

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

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

  • Интерфейсы репозитория
  • Сервисные интерфейсы

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

Спасибо!

2 ответа

Решение

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

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

(*) Если ваш бизнес связан с обработкой заказов, то реализация ваших 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>();

Сервис - это основная бизнес-логика вашего приложения, весь рабочий процесс, и вы не можете обеспечить реализацию извне (на уровне инфраструктуры). Только репозитории должны быть реализованы извне, потому что они специфичны, например, вы реализовали соединения с БД с Ado.net, но однажды вы решили изменить это с помощью EF.core. Вы должны создать новый класс в инфраструктуре и реализовать тот же интерфейс репозитория из ядра. Исполняемый проект Erom. Вы можете указать, какую реализацию использовать.

Другие вопросы по тегам