Onion Architeture - ASP.NET MVC需要参考Infrstructure吗?

时间:2013-01-29 09:53:36

标签: asp.net-mvc architecture reference

我不确定我是否在搜索主题方面做得很好,但我似乎无法找到问题的答案。根据我的理解,Onion Architecture在同一层上具有UI和基础设施。假设我在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?根据我对洋葱架构的理解(如果我理解正确),UI应该没有引用DAL。有人可以解释一下吗?

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

  3. 非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您需要一个额外的配置模块/图层,它将连接ui和dal。如果你自己实现这个没有反射,那么这个配置moudul需要所有引用。

通常onion-architecturedependency injection container一起工作,可以在运行时通过配置文件或检查本地程序集来解析引用。

答案 1 :(得分:0)

  
      
  1. UI(ASP.NET MVC)是否需要引用OrderSaverDAL?根据我对洋葱建筑的理解(如果我理解正确),   UI应该没有DAL的引用。有人可以请   解释
  2.   

您说得对,逻辑上不应该依赖于DAL。

然而,正如k3b所指出的,进行依赖性反转(Onion Architecture严重依赖)的常用方法是通过DI容器。然后,您需要某种Composition Root,这是一个使用容器组成应用程序对象图的位置。组合根必须是“无所不知的”,并且需要引用每个项目以便连接起来。

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