我正在了解洋葱建筑。我对服务层感到困惑,因为我看到有些人说核心层应该只包含:
但是其他人表示它也应该实现服务接口。那么什么层应该实现服务接口?
我认为基础设施层应该实现:
并在请求时将它们注入UI层和测试层。
谢谢!
答案 0 :(得分:22)
核心层应包含:
(*)如果您的业务是关于处理订单,那么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>();
答案 1 :(得分:0)
服务是您应用程序的核心业务逻辑,是整个工作流程,您无法从外部(从基础设施层)提供实现。只应从外部实现存储库,因为它们是特定的,例如,您使用 Ado.net 实现了数据库连接,但有一天您决定使用 EF.core 更改它。您应该在基础设施中创建新类并从核心实现相同的存储库接口。 Erom 可执行项目您可以控制要使用的实现。