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. Вы можете указать, какую реализацию использовать.