0

我不确定我是否在搜索主题方面做得很好,但我似乎无法找到我的问题的答案。根据我的理解,Onion Architecture 的 UI 和 Infrastructure 在同一层。假设我在 ASP.NET MVC 项目中有我的 UI,我有 DAL 项目,这是我的基础设施。假设我的代码如下所示:

核:

//IOrderSaver接口也被定义在核心上

public class OrderService
{
    private IOrderSaver orderSaver;

    public OrderService(IOrderSaver orderSaver)
    {
        this.orderSaver = orderSaver;
    }

    public void AcceptOrder(Order order)
    {
        orderSaver.SaveOrder(order);
    }
}

基础设施(DAL):

public class OrderSaverDAL : IOrderSaver
{
    //implementation goes here
}

现在,在我的 UI(ASP.NET MVC)中,我想实例化 OrderService 类,以便它可以接受订单。为了让 UI 做到这一点,它必须将 IOrderSaver 传递给构造函数。它需要通过 OrderSaverDAL。

问题

  1. UI (ASP.NET MVC) 是否需要引用 OrderSaverDAL?根据我对 Onion Architecture 的理解(如果我理解正确的话),UI 应该没有对 DAL 的引用。有人可以解释一下吗?

  2. 如果我不需要从我的 ASP.NET MVC 项目中引用 OrderSaverDAL,我将如何在 ASP.NET MVC 中构造 OrderService?您能否通过提供有关如何实现此目的的示例代码来指导我?

非常感谢您的帮助!

4

2 回答 2

2

您需要一个额外的配置模块/层来连接 ui 和 dal。如果您自己实现此功能而不进行反射,则此配置模块需要所有参考。

通常洋葱架构依赖注入容器一起工作,该容器可以在运行时通过配置文件或检查本地程序集来解析引用。

于 2013-01-29T10:23:36.577 回答
0
  1. UI (ASP.NET MVC) 是否需要引用 OrderSaverDAL?根据我对 Onion Architecture 的理解(如果我理解正确的话),UI 应该没有对 DAL 的引用。有人可以解释一下吗?

你说得对,UI 在逻辑上不应该依赖于 DAL。

然而,正如 k3b 所指出的,进行依赖倒置(洋葱架构严重依赖其)的一种常见方法是通过 DI 容器。然后,您需要某种Composition Root,这是使用容器组合应用程序对象图的地方。组合根必须是“无所不知”的,并且需要对每个项目的引用才能将其连接起来。

事实证明,UI 通常是托管合成根的位置,因为 UI 是应用程序的自然起点,非常适合在正确的时间进行合成。您可以为您的合成根创建一个单独的项目,但这不太方便。

于 2013-01-29T14:14:48.530 回答