在現代軟體開發中,高效地構建應用程式對於可維護性、可伸縮性和適應力至關重要。在 .NET 社群中越來越受歡迎的一種體系結構模式是
垂直切片體系結構
。
與傳統的分層架構不同,垂直切片強調將應用程式劃分為功能,而不是 UI、業務邏輯和數據存取等技術問題。
這種方法增強了凝聚力,減少了依賴性,並使其更容易獨立地處理特定功能。
什麽是垂直切片?
垂直切片是指圍繞應用程式的功能構建應用程式,每個切片代表一個完整的、獨立的功能,包含從使用者介面到資料庫的所有必要元件。每個切片包括:
表示層 :負責使用者互動,通常是 Web UI 或 API。
業務邏輯層 :包含域邏輯和業務規則。
數據存取層 :管理數據永續性和檢索。
垂直切片的好處
功能獨立 性:每個功能都是獨立的,因此可以更輕松地獨立開發、測試和部署。
提高凝聚力 :功能的所有部份都位於一起,增強了理解並減輕了開發人員的認知負擔。
更易於維護 :隔離功能可最大程度地減少更改的影響,並使偵錯更簡單。
增強的可延伸性 :功能可以獨立擴充套件,最佳化資源使用。
在 .NET 中實作垂直切片
讓我們演練一個在 .NET Web API 應用程式中實作垂直切片的範例。
第 1 步:設定計畫
建立新的 ASP.NET Core Web API 計畫:
dotnet new webapi -n VerticalSlicingExample
cd VerticalSlicingExample
第 2 步:定義特征結構
按要素而不是圖層組織工程。例如,如果您的應用程式具有 和 功能,請按如下方式構建它:
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
步驟 3:實作特征切片
讓我們實作特征切片。
CreateOrderCommand.cs
public classCreateOrderCommand
{
publicstring ProductName { get; set; }
publicint Quantity { get; set; }
publicdecimal Price { get; set; }
}
CreateOrderHandler.cs
public classCreateOrderHandler
{
privatereadonlyApplicationDbContext _context;
publicCreateOrderHandler(ApplicationDbContext context)
{
_context = context;
}
publicasyncTaskHandle(CreateOrderCommand command)
{
var order = newOrder
{
ProductName = command.ProductName,
Quantity = command.Quantity,
Price = command.Price,
OrderDate = DateTime.UtcNow
};
_context.Orders.Add(order);
await _context.SaveChangesAsync();
}
}
CreateOrderController.cs
[ApiController]
[Route("api/[controller]")]
public classCreateOrderController : ControllerBase
{
privatereadonlyCreateOrderHandler _handler;
publicCreateOrderController(CreateOrderHandler handler)
{
_handler = handler;
}
[HttpPost]
publicasyncTask<IActionResult>Post(CreateOrderCommand command)
{
await _handler.Handle(command);
returnOk();
}
}
步驟 4:註冊依賴項
在 中,註冊依賴項:Startup.cs
publicvoidConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddTransient<CreateOrderHandler>();
services.AddControllers();
}
步驟 5:配置資料庫上下文
ApplicationDbContext.cs
public classApplicationDbContext : DbContext
{
publicApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
publicDbSet<Order> Orders { get; set; }
}
public classOrder
{
publicint Id { get; set; }
publicstring ProductName { get; set; }
publicint Quantity { get; set; }
publicdecimal Price { get; set; }
publicDateTime OrderDate { get; set; }
}
使用連線字串進行更新:appsettings.json
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=VerticalSlicingDb;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
步驟 6:執行應用程式
執行應用程式並使用 Postman 等工具測試終結點。使用表示 的 JSON 正文向 發送 POST 請求。
將垂直切片與 SOA 整合
在面向服務的體系結構 (SOA) 中,每個服務都是一個獨立的單元,具有其業務邏輯和數據儲存。垂直切片透過確保每個服務(或微服務)都以功能為中心來補充 SOA。每個服務都可以公開其 API 端點,同時封裝其數據存取和業務邏輯,遵循單一責任原則。
範例:Orders Microservice
表示層 :ASP.NET 核心 Web API
業務邏輯層 :包含在每個處理常式類中。
數據存取層 :用於資料庫操作的實體框架核心或 Dapper。
範例:客戶微服務
表示層 :ASP.NET 核心 Web API
業務邏輯層 :包含在每個處理常式類中。
數據存取層 :用於資料庫操作的實體框架核心或 Dapper。
將垂直切片擴充套件到其他技術
垂直切片也可以套用於 Angular、React 或 Vue.js 等前端技術,其中每個功能切片都包括元件、服務和狀態管理。
此外,它可以與 Azure 或 AWS 等雲服務整合,其中每個切片都可以具有其無伺服器函式、儲存帳戶和其他資源。
範例:Angular 功能模組
使用功能模組構建 Angular 計畫:
src
│
├── app
│ ├── orders
│ │ ├── create-order
│ │ │ ├── create-order.component.ts
│ │ │ ├── create-order.service.ts
│ │ │ ├── create-order.component.html
│ │ │ └── create-order.component.css
│ │ └── get-order
│ │ ├── get-order.component.ts
│ │ ├── get-order.service.ts
│ │ ├── get-order.component.html
│ │ └── get-order.component.css
│ └── customers
│ ├── create-customer
│ │ ├── create-customer.component.ts
│ │ ├── create-customer.service.ts
│ │ ├── create-customer.component.html
│ │ └── create-customer.component.css
│ └── get-customer
│ ├── get-customer.component.ts
│ ├── get-customer.service.ts
│ ├── get-customer.component.html
│ └── get-customer.component.css
範例:Azure 函式套用
按功能構建 Azure 函式套用:
FunctionApp
│
├── Orders
│ ├── CreateOrder
│ │ ├── index.js
│ │ └── function.json
│ └── GetOrder
│ ├── index.js
│ └── function.json
└── Customers
├── CreateCustomer
│ ├── index.js
│ └── function.json
└── GetCustomer
├── index.js
└── function.json
傳統分層架構與垂直切片架構
傳統分層架構
結構 :
根據技術問題將應用程式劃分為水平層。
典型的層包括表示、業務邏輯和數據存取。
凝聚力 :
由於相關代分碼散在多個層中,因此功能內的內聚力較低。
層內凝聚力高,但不一定跨要素。
依賴關系 :
層以分層方式相互依賴。
較低層(例如,數據存取)的變化可能會對較高層(例如,演示)產生連鎖反應。
功能開發 :
需要接觸多個圖層才能實作單個功能。
由於跨層變化,開發速度較慢。
可延伸性 :
水平縮放需要復制整個圖層。
更難獨立擴充套件特定功能。
保養:
維護起來更具挑戰性,因為更改通常需要跨多個層進行更新。
由於特征邏輯的分散,偵錯可能很復雜。
測試 :
單元測試側重於單個層,因此整合測試對於整體驗證至關重要。
更復雜的測試設定,以確保所有層都能正常工作。
垂直切片架構
結構 :
根據功能將應用程式劃分為垂直切片。
每個切片都包含自己的 Presentation、Business Logic 和 Data Access 元件。
凝聚力 :
由於所有相關程式碼都位於一起,因此每個功能切片內具有很高的內聚力。
每個切片獨立執行。
依賴關系 :
功能彼此獨立。
一個要素切片中的更改對其他要素切片的影響最小。
功能開發 :
開發速度更快,因為每個功能都可以獨立實作。
開發人員可以一次專註於一個切片,而不必擔心應用程式的其他部份。
可延伸性 :
更輕松地獨立擴充套件特定功能。
每個功能都可以根據需要進行部署和擴充套件,而不會影響其他功能。
保養:
由於更改在要素切片中在地化,因此更易於維護。
由於所有相關程式碼都包含在切片中,因此簡化了偵錯。
測試 :
單元測試側重於單個功能切片,從而可以更輕松地隔離和測試功能。
整合測試更直接,因為每個切片都是一個完整的功能。
總結
傳統的分層架構 適用於較小的應用程式,或者當保持嚴格的關註點分離至關重要時,但隨著應用程式的增長,它可能會導致開發和維護挑戰變慢。
垂直切片架構 非常適合功能獨立性、開發速度更快、更易於維護的大型復雜應用程式。它與微服務和領域驅動設計等現代開發實踐非常吻合。
如果你喜歡我的文章,請給我一個贊!謝謝