当前对过去 20 年评估的良好软件架构的理解。单体架构被评估为多层架构,后来被称为清洁架构。
\ 但是,真正让软件架构成为一个好的架构的是什么?良好的软件架构是在项目生命周期中做出并遵循的描述架构特征和结构的原则的大量架构决策。
好的架构可以用可扩展性、可维护性、可测试性、可用性等特性来衡量。让我们看看多层和清洁架构如何满足这些特性。
\
N 层架构
在深入了解清洁架构之前,让我们看看多层架构提供了什么以及为什么它被评估为清洁架构。
\
多层架构也称为 N 层架构,与单片架构相比具有许多优势。让我们看看其中的一些:
\
- 可维护性:您可以单独管理每一层,添加或修改每一层而不影响其他层。
- 可扩展性:如果您需要添加更多资源,您可以按层进行,而不会影响其他层。
- 灵活性:除了独立的可扩展性之外,您还可以根据您的要求以任何方式扩展每一层。
- 可重用性:由于应用程序被划分为独立的层,您可以轻松地将每一层重用于其他软件项目。
\ 这个架构非常好,对于许多大项目来说,它的重要性是难以估量的。然而,这种架构存在一个大问题。它是系统所有层的耦合。传递依赖仍然是依赖。如果业务逻辑不存在,则 UI 无法运行。如果数据访问不存在,业务逻辑将无法运行。数据访问层经常变化。从历史上看,该行业至少每三年修改一次数据访问技术。如果耦合阻碍了系统部分的轻松升级,那么遗留系统就会变得陈旧,最终它们会被重写。
\
清洁架构
2012 年, Bob 大叔首次将其描述为一种干净的架构。有许多类似的架构具有相同的概念:
•洋葱架构
•垂直切片架构
\
\ 该架构工作的主要规则称为依赖规则。该规则规定源代码依赖项只能指向内部。内圈中的任何事物都无法知道外圈中的任何事物。这意味着在内圈的代码中不得提及包括在外圈中声明的函数、类、变量或任何其他程序对象。
\ 同样,外圈使用的数据格式也不应该在内圈使用,尤其是那些格式是由外圈的框架生成的。
领域模型
架构的中心是域模型,它是状态和行为的组合,为组织建模。域模型周围还有其他具有更多行为的层。应用程序核心中的层数可能会有所不同,但域模型是最中心的,并且由于所有通信都指向中心,因此域模型仅连接到自身。
\ 通常有提供存储和检索对象行为的接口,称为存储库接口。但是,对象的持久性行为并不是应用程序的核心,因为它通常与数据库相关联。应用程序的核心只是界面。
域和应用程序服务
通常域服务层包含特定于域的业务逻辑。应用程序服务层包含特定于应用程序逻辑的服务。这两种服务的主要区别在于域服务在核心域实体上执行业务逻辑,而应用程序服务执行特定于应用程序本身的逻辑。因此,如果您想定义如何处理 UI 上的某些按钮单击的逻辑,它可能是应用程序服务。如果您想定义如何在系统中创建订单的规则,它可能是域服务。
用户界面。测试。基础设施
作为外层,我们看到用户界面、基础设施和测试。它是为经常变化的事物保留的。这些东西应该有意地与应用程序的核心隔离开来。在这里,我们将找到一个实现存储库接口的类。此类与特定的数据访问方法相关联,因此它位于应用程序的核心之外。
\ 该架构严重依赖依赖倒置的原则。应用程序的核心需要实现核心接口,如果这些接口的实现在外层,我们需要一些机制在运行时注入这些代码。
\ 数据库不是应用程序的中心。这是外部资源。对于那些习惯于将应用程序视为“数据库应用程序”的人来说,将数据库外部化可能是一个巨大的变化。有些应用程序可以将数据库用作存储服务,但只能通过实现对应用程序核心有意义的接口的外部基础架构代码。将应用程序与数据库、文件系统等分开可以降低应用程序生命周期内的维护成本。
溶液样品
现在,当我们了解了 Clean Architecture 组件后,让我们看看使用 .NET 的应用程序解决方案结构。这是一个与用户一起工作的简单 Web 服务应用程序。您可以在GitHub 上找到源代码。
\ 首先,让我们看看Core
项目结构。它包含带有域模型的实体文件夹。 Interfaces
文件夹,其中包含域功能所需的接口定义。 Services
文件夹,其中包含管理域实体的服务。带有一些通用类(如异常、助手等)的Common
文件夹。
Infrastructure
项目包含数据库上下文接口的实现以访问数据库和迁移以管理数据库更改。
Web API
项目包含访问用户功能的 REST 服务。此处UserModel.cs
包含用于将数据从客户端(Web API)传输到域的 DTO 类。
所有依赖注入工作都在Startup.cs
文件中完成:
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo {Title = "CleanArchitecture.Sample.Api", Version = "v1"}); }); services.AddSingleton(Configuration.GetSection(PostgresSettings.SectionName).Get<PostgresSettings>()); services.AddScoped<IUserService, UserService>(); // register application DB context services.AddApplicationDbContext(Configuration); }
概括
清洁架构是软件应用程序架构的演变,它把领域模型放在中心,而不是数据库,因为它在 n 层架构中。此外,依赖规则是该架构的主要假设。将系统划分为多个层使其可测试。当数据库或任何其他服务过期时,您可以轻松更换它。
原文: https://hackernoon.com/from-n-tier-to-clean-architecture-with-net?source=rss