我不确定我是否在搜索主题方面做得很好,但我似乎无法找到问题的答案。根据我的理解,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。
问题:
UI(ASP.NET MVC)是否需要引用OrderSaverDAL?根据我对洋葱架构的理解(如果我理解正确),UI应该没有引用DAL。有人可以解释一下吗?
如果我不需要从我的ASP.NET MVC项目中引用OrderSaverDAL,我将如何在ASP.NET MVC中构建OrderService?您能否通过提供如何实现此目的的示例代码来指导我?
非常感谢您的帮助!
答案 0 :(得分:2)
您需要一个额外的配置模块/图层,它将连接ui和dal。如果你自己实现这个没有反射,那么这个配置moudul需要所有引用。
通常onion-architecture与dependency injection container一起工作,可以在运行时通过配置文件或检查本地程序集来解析引用。
答案 1 :(得分:0)
- UI(ASP.NET MVC)是否需要引用OrderSaverDAL?根据我对洋葱建筑的理解(如果我理解正确), UI应该没有DAL的引用。有人可以请 解释
醇>
您说得对,逻辑上不应该依赖于DAL。
然而,正如k3b所指出的,进行依赖性反转(Onion Architecture严重依赖)的常用方法是通过DI容器。然后,您需要某种Composition Root,这是一个使用容器组成应用程序对象图的位置。组合根必须是“无所不知的”,并且需要引用每个项目以便连接起来。
事实证明,UI通常是托管组合根的位置,因为UI是应用程序中的自然起点,非常适合在合适的时间进行组合。您可以为Composition Root创建一个单独的项目,但这样不太方便。