Closed tonyqus closed 1 day ago
通常 .NET
应用程序的架构是按照水平层次的划分,划分的标准是技术层面,比如 UI 层,业务逻辑层和数据访问层。有一种其他的划分方式是垂直的方式,通常将每个功能封装一个切片,每个切片包含三个层:
以 ASP.NET Core Web API
为例,整个项目架构如下:
VerticalSlicingExample
│
├── Features
│ ├── Orders
│ │ ├── CreateOrder
│ │ │ ├── CreateOrderCommand.cs
│ │ │ ├── CreateOrderHandler.cs
│ │ │ └── CreateOrderController.cs
│ │ └── GetOrder
│ │ ├── GetOrderQuery.cs
│ │ ├── GetOrderHandler.cs
│ │ └── GetOrderController.cs
│ └── Customers
│ ├── CreateCustomer
│ │ ├── CreateCustomerCommand.cs
│ │ ├── CreateCustomerHandler.cs
│ │ └── CreateCustomerController.cs
│ └── GetCustomer
│ ├── GetCustomerQuery.cs
│ ├── GetCustomerHandler.cs
│ └── GetCustomerController.cs
├── Program.cs
└── Startup.cs
和传统分层的架构相比较,有如下的优缺点: 传统分层架构
结构: 根据技术关注点将应用程序划分为水平层。 典型的层包括表示层、业务逻辑层和数据访问层。
内聚性: 功能内聚性较低,因为相关代码分散在多个层中。 层内内聚性高,但跨功能的内聚性不一定高。
依赖性: 层之间以层级方式相互依赖。 较低层的变更(例如,数据访问层)可能对较高层(例如,表示层)产生连锁反应。
功能开发: 实现单个功能需要触及多个层。 由于跨层变更,开发速度较慢。
可扩展性: 水平扩展需要复制整个层。 难以独立扩展特定功能。
维护: 维护更具挑战性,因为变更通常需要跨多个层进行更新。 由于功能逻辑的分散,调试可能复杂。
测试: 单元测试关注各个层,使得整体验证的集成测试至关重要。 测试设置更复杂,以确保所有层正确协同工作。
垂直切片架构
结构: 根据功能将应用程序划分为垂直切片。 每个切片包括自己的表示层、业务逻辑层和数据访问组件。
内聚性: 每个功能切片内部高度内聚,所有相关代码位于一起。 每个切片独立运作。
依赖性: 功能彼此独立。 一个功能切片的变更对其他切片的影响最小。
功能开发: 由于每个功能可以独立实现,开发速度更快。 开发者可以一次专注于一个切片,无需担心应用程序的其他部分。
可扩展性: 更容易独立扩展特定功能。 每个功能可以根据需要部署和扩展,而不会影响其他功能。
维护: 由于变更局限于功能切片内,维护更容易。 由于所有相关代码都包含在一个切片内,调试简化。
测试: 单元测试关注个别功能切片,使得隔离和测试功能更容易。 集成测试更为直接,因为每个切片都是一个完整的功能。
https://medium.com/codenx/vertical-slicing-architecture-in-net-6efa39b139e7