我正在学习洋葱架构。我对服务层有一个困惑,因为我看到有人说核心层应该只包含:
- 楷模
- 存储库接口
- 服务接口
但其他人表示它也应该实现服务接口。那么应该在哪一层实现服务接口呢?
我认为基础设施层应该实现:
- 存储库接口
- 服务接口
并在请求时将它们注入 UI 层和测试层。
谢谢!
我正在学习洋葱架构。我对服务层有一个困惑,因为我看到有人说核心层应该只包含:
但其他人表示它也应该实现服务接口。那么应该在哪一层实现服务接口呢?
我认为基础设施层应该实现:
并在请求时将它们注入 UI 层和测试层。
谢谢!
核心层应包含:
(*)如果你的业务是处理订单,那么你的实现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 可执行项目 您可以控制要使用的实现。