在现代软件开发中,高效地构建应用程序对于可维护性、可伸缩性和适应性至关重要。在 .NET 社区中越来越受欢迎的一种体系结构模式是垂直切片体系结构。
与传统的分层架构不同,垂直切片强调将应用程序划分为功能,而不是 UI、业务逻辑和数据访问等技术问题。
这种方法增强了凝聚力,减少了依赖性,并使其更容易独立地处理特定功能。
垂直切片是指围绕应用程序的功能构建应用程序,每个切片代表一个完整的、独立的功能,包含从用户界面到数据库的所有必要组件。每个切片包括:
让我们演练一个在 .NET Web API 应用程序中实现垂直切片的示例。
创建新的 ASP.NET Core Web API 项目:
dotnet new webapi -n VerticalSlicingExample
cd VerticalSlicingExample
按要素而不是图层组织工程。例如,如果您的应用程序具有 和 功能,请按如下方式构建它:
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
让我们实现特征切片。
CreateOrderCommand.cs
public class CreateOrderCommand
{
public string ProductName { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
}
CreateOrderHandler.cs
public class CreateOrderHandler
{
private readonly ApplicationDbContext _context;
public CreateOrderHandler(ApplicationDbContext context)
{
_context = context;
}
public async Task Handle(CreateOrderCommand command)
{
var order = new Order
{
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 class CreateOrderController : ControllerBase
{
private readonly CreateOrderHandler _handler;
public CreateOrderController(CreateOrderHandler handler)
{
_handler = handler;
}
[HttpPost]
public async Task<IActionResult> Post(CreateOrderCommand command)
{
await _handler.Handle(command);
return Ok();
}
}
在 中,注册依赖项:Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddTransient<CreateOrderHandler>();
services.AddControllers();
}
ApplicationDbContext.cs
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
public DbSet<Order> Orders { get; set; }
}
public class Order
{
public int Id { get; set; }
public string ProductName { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
public DateTime 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。每个服务都可以公开其 API 端点,同时封装其数据访问和业务逻辑,遵循单一责任原则。
示例:Orders Microservice
示例:客户微服务
垂直切片也可以应用于 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
结构:
凝聚力:
依赖关系:
功能开发:
可扩展性:
保养:
测试:
结构:
凝聚力:
依赖关系:
功能开发:
可扩展性:
保养:
测试: