13

我正在学习洋葱架构。我对服务层有一个困惑,因为我看到有人说核心层应该只包含:

  • 楷模
  • 存储库接口
  • 服务接口

但其他人表示它也应该实现服务接口。那么应该在哪一层实现服务接口呢?

我认为基础设施层应该实现:

  • 存储库接口
  • 服务接口

并在请求时将它们注入 UI 层和测试层。

谢谢!

4

2 回答 2

27

核心层应包含:

  • Models/Entities/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>();
于 2013-06-06T09:56:50.023 回答
0

服务是您的应用程序的核心业务逻辑,是整个工作流程,您无法从外部(从基础设施层)提供实现。只应从外部实现存储库,因为它们是特定的,例如您使用 Ado.net 实现了数据库连接,但有一天您决定使用 EF.core 更改它。您应该在基础设施中创建新类并从核心实现相同的存储库接口。Erom 可执行项目 您可以控制要使用的实现。

于 2021-06-20T18:20:03.867 回答