洋葱架构:业务服务接口和实现

时间:2013-05-31 15:44:56

标签: asp.net-mvc ninject onion-architecture

我正在了解洋葱建筑。我对服务层感到困惑,因为我看到有些人说核心层应该只包含:

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

但是其他人表示它也应该实现服务接口。那么什么层应该实现服务接口?

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

  • 存储库接口
  • 服务接口

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

谢谢!

2 个答案:

答案 0 :(得分:22)

核心层应包含:

  • 模型/实体/ POCO / 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>();

答案 1 :(得分:0)

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