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

Sau*_*sir 4 .net architecture software-design n-layer onion-architecture

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

它看起来像一个 N 层架构。如果我引入接口,它是否可以与ONION架构相媲美。\n
如何将其转换为 ONION 架构而不影响安全性可扩展性性能依赖关系图\n项目依赖

\n

Yai*_*adt 5

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

N层:

数据访问层:

public class SqlNumbersGetter
{
    public List<int> GetNumbers() => ...
}
Run Code Online (Sandbox Code Playgroud)

业务逻辑层:

public class Summer
{
    public int GetSum() => new SqlNumbersGetter().GetNumbers().Sum();
}
Run Code Online (Sandbox Code Playgroud)

桂层:

public class ConsoleDisplayer
{
    public void Display() => Console.WriteLine( new Summer().GetSum());
}
Run Code Online (Sandbox Code Playgroud)

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

数据访问层:

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

public class SqlNumbersGetter : INumbersGetter
{
    public List<int> GetNumbers() => ...
}
Run Code Online (Sandbox Code Playgroud)

业务逻辑层:

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

桂层:

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));
}
Run Code Online (Sandbox Code Playgroud)

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

public void Main()
{
    new ConsoleDisplayer().Display(new Summer(), new SqlNumbersGetter());
}
Run Code Online (Sandbox Code Playgroud)