當前位置: 妍妍網 > 碼農

.NET 中的垂直切片體系結構

2024-06-24碼農

在現代軟體開發中,高效地構建應用程式對於可維護性、可伸縮性和適應力至關重要。在 .NET 社群中越來越受歡迎的一種體系結構模式是 垂直切片體系結構

與傳統的分層架構不同,垂直切片強調將應用程式劃分為功能,而不是 UI、業務邏輯和數據存取等技術問題。

這種方法增強了凝聚力,減少了依賴性,並使其更容易獨立地處理特定功能。

什麽是垂直切片?

垂直切片是指圍繞應用程式的功能構建應用程式,每個切片代表一個完整的、獨立的功能,包含從使用者介面到資料庫的所有必要元件。每個切片包括:

  1. 表示層 :負責使用者互動,通常是 Web UI 或 API。

  2. 業務邏輯層 :包含域邏輯和業務規則。

  3. 數據存取層 :管理數據永續性和檢索。

垂直切片的好處

  1. 功能獨立 性:每個功能都是獨立的,因此可以更輕松地獨立開發、測試和部署。

  2. 提高凝聚力 :功能的所有部份都位於一起,增強了理解並減輕了開發人員的認知負擔。

  3. 更易於維護 :隔離功能可最大程度地減少更改的影響,並使偵錯更簡單。

  4. 增強的可延伸性 :功能可以獨立擴充套件,最佳化資源使用。

在 .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 元件。

  • 凝聚力

  • 由於所有相關程式碼都位於一起,因此每個功能切片內具有很高的內聚力。

  • 每個切片獨立執行。

  • 依賴關系

  • 功能彼此獨立。

  • 一個要素切片中的更改對其他要素切片的影響最小。

  • 功能開發

  • 開發速度更快,因為每個功能都可以獨立實作。

  • 開發人員可以一次專註於一個切片,而不必擔心應用程式的其他部份。

  • 可延伸性

  • 更輕松地獨立擴充套件特定功能。

  • 每個功能都可以根據需要進行部署和擴充套件,而不會影響其他功能。

  • 保養:

  • 由於更改在要素切片中在地化,因此更易於維護。

  • 由於所有相關程式碼都包含在切片中,因此簡化了偵錯。

  • 測試

  • 單元測試側重於單個功能切片,從而可以更輕松地隔離和測試功能。

  • 整合測試更直接,因為每個切片都是一個完整的功能。

  • 總結

  • 傳統的分層架構 適用於較小的應用程式,或者當保持嚴格的關註點分離至關重要時,但隨著應用程式的增長,它可能會導致開發和維護挑戰變慢。

  • 垂直切片架構 非常適合功能獨立性、開發速度更快、更易於維護的大型復雜應用程式。它與微服務和領域驅動設計等現代開發實踐非常吻合。

  • 如果你喜歡我的文章,請給我一個贊!謝謝