我正在制作一个基于.Net的应用程序的结构。目前,我使用的是 MVC 5。以下是系统不同组件的详细信息。
1. 数据库 – 这是底层数据库,将包含数据
2. OData API – 此 API 将与数据库交互,并且仅执行与数据库相关的操作 (CRUD)。我希望这个 API 成为访问和操作数据的唯一平台。它将提供通过不同方式(IQueryable、SQL 查询、存储过程)检索数据的功能。
3. 商业服务 – 它由两部分组成。引擎和API。引擎中将包含业务逻辑,其中可能包括业务规则,例如 WorkflowEngine 将处理所有工作流操作。驻留工作流程操作(CRUD 操作)和非常驻工作流程操作(提交、批准、发回)。 API将在UI和引擎之间进行通信。然后引擎将运行业务逻辑并与 OData 进行通信。 BusinessAPI 将是专有 API,对这些 API 的访问将基于订阅(付费访问)。
4. UI – 用户界面将基于 MVC,仅与业务 API 交互,并且仅负责显示数据并将数据发送回 BusinessAPI。
它看起来像一个N层架构。如果我引入接口,它是否可以与ONION架构相媲美。
如何将其转换为 ONION 架构而不影响安全性、可扩展性和性能。
洋葱架构本质上是一个利用依赖注入的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());
}
简而言之,洋葱架构可以帮助您构建一个松散的耦合系统,某种程度上就像一个插件系统。您的中心是业务逻辑、核心,其他所有内容(用户界面客户端、第三方库、数据库存储库等)都可以更改,而无需更改该核心层中的某些内容。
这是一个遵循 SOLID 原则的良好架构:
“当有新需求时,您可以向该系统添加新功能,而无需修改任何旧代码。这些功能只能通过编写新代码来添加。”鲍勃叔叔
Liskov 替换原则和 I接口隔离原则更多的是针对您构造类的方式,简而言之:倾向于组合而不是继承,以及如果系统的组件仅对方法的子集感兴趣对于一个类,为该组件提供一个仅包含其感兴趣的方法子集的类的接口
D依赖倒置原则:您的高级策略组件不应依赖于低级细节组件。接口应该由高层组件决定,细节必须符合它。例如,你的核心层不应该依赖于用户界面的实现,用户界面应该通过接口依赖于核心。
在这里你可以找到洋葱架构的详细解释: Victor Rentea - 整洁代码的艺术: https://www.youtube.com/watch?v=c0L7EdsxQ_c