了解ONION与N层架构之间的区别

时间:2018-11-25 11:54:40

标签: .net architecture software-design onion-architecture n-layer

我正在构建基于.Net的应用程序的结构。现在,我正在使用MVC5。这是系统不同组件的详细信息。
1。 数据库 –这是基础数据库,将包含数据
2。 OData API –该API将与数据库进行交互,并且仅执行与数据库相关的操作(CRUD)。我希望此API成为访问和处理数据的唯一平台。它将提供通过不同方式(IQueryable,SQL查询,存储过程)检索数据的功能。
3。 业务服务 –它由两部分组成。引擎和API。引擎中将包含业务逻辑,其中可能包含业务规则,例如WorkflowEngine将处理所有工作流操作。常驻工作流操作(CRUD Ops)和非常驻工作流操作(提交,批准,发回)。 API将在UI和引擎之间进行通信。然后,引擎将运行业务逻辑并与OData通信。 BusinessAPI将是专有API,对这些API的访问将基于订阅(付费访问)。
4。 UI –用户界面将基于MVC,并且仅与Business API交互,并且仅负责显示数据并将数据发送回BusinessAPI。


它看起来像N层架构。如果我介绍接口,它可以与ONION Architecture相提并论。
如何在不损害安全性可扩展性性能的前提下将其转换为ONION体系结构。 Dependency Diagram Project Dependency

2 个答案:

答案 0 :(得分:1)

洋葱架构本质上是利用依赖项注入的n层架构。例如,考虑一个应用程序,该应用程序需要一些数字,将它们相加并显示结果。

N层:

数据访问层:

public class SqlNumbersGetter
{
    public List<int> GetNumbers() => ...
}

业务逻辑层:

public class Summer
{
    public int GetSum() => new SqlNumbersGetter().GetNumbers().Sum();
}

Gui层:

public class ConsoleDisplayer
{
    public void Display() => Console.WriteLine( new Summer().GetSum());
}

洋葱的架构非常相似,但是我们现在使用接口和依赖注入:

数据访问层:

public interface INumbersGetter
{
     List<int> GetNumbers();
}

public class SqlNumbersGetter : INumbersGetter
{
    public List<int> GetNumbers() => ...
}

业务逻辑层:

public interface ISummer
{
    int GetSum(INumbersGetter numberGetter);
}
public class Summer : ISummer
{
    public int GetSum(INumbersGetter numberGetter) => numberGetter.GetNumbers().Sum();
}

Gui层:

public interface IDisplayer
{
    public void Display(ISummer summer, INumbersGetter numberGetter)
}
public class ConsoleDisplayer : IDisplayer
{
    public void Display(ISummer summer, INumbersGetter numberGetter) => Console.WriteLine(summer.GetSum(numberGetter));
}

然后,您将让您的应用程序实例化接口的所有实例,并将它们全部链接起来

public void Main()
{
    new ConsoleDisplayer().Display(new Summer(), new SqlNumbersGetter());
}

答案 1 :(得分:0)

简而言之,洋葱架构可以帮助您构建一个松散的耦合系统,就像插件系统一样。您可以在中心更改Businesses逻辑,核心以及其他所有内容(用户界面客户端,第三方库,数据库存储库等),而无需在此核心层中进行任何更改。

这是遵循 SOLID 原则的好架构:

  • 每个部分都负有 S 责任,将出于相同原因而发生变化的事情汇总在一起。您希望将模块与整个组织的复杂性隔离开来,并设计系统以使每个模块仅负责(响应)该业务功能的需求。
  • O 笔封闭原理:编程以进行接口连接,以便您可以更改实际实现,而不会对客户端模块“
  • 产生涟漪效应
  

“当有新要求时,您可以在不修改任何旧代码的情况下向该系统添加新功能。这些功能只能通过编写新代码来添加。” Bob叔叔

  • L iskov替换原理和 I 接口隔离原理,它更适合于您构造类的方式,不久之后:支持组合vs.继承,以及系统的一个组件仅对类的方法的子集感兴趣,请为该组件提供到类的接口,该接口仅包含其感兴趣的方法的子集

  • D 倾向反转原理:您的高级策略组件不应依赖于低级别的详细信息组件。接口应该由高级组件决定,并且细节必须与其相符。例如,您的核心层不应该依赖于用户界面的实现,用户界面应该依赖于核心槽式界面。

在这里您可以找到有关洋葱结构的详细说明: Victor Rentea-简洁代码的艺术: https://www.youtube.com/watch?v=c0L7EdsxQ_c

设计方案: onion architecture