引言
在現代軟體開發中,代碼生成器正變得越來越流行,尤其是在 .NET 5 中引入的新特性。通過源代碼生成器,我們可以在編譯時自動生成代碼,進而減少手動編寫的樣闆代碼。本文将探讨如何結合 MediatR 庫和 CQRS 模式,使用 .NET 源代碼生成器自動為系統生成 API。
1. 了解中介者模式(Mediator Pattern)
中介者模式是一種行為設計模式,它允許我們通過一個中介對象來封裝一系列對象之間的互動。在 .NET 中,MediatR 是實作這一模式的流行庫之一。
```csharp public class CreateUser : IRequest<string> { public string Id { get; set; } public string Name { get; set; } } [Route("api/[controller]")] [ApiController] public class CommandController : ControllerBase { private readonly IMediator _mediator; public CommandController(IMediator mediator) { _mediator = mediator; } [HttpPost] public async Task<string> Get([FromBody] CreateUser command) { return await _mediator.Send(command); } } ```
2. 實作指令處理程式
在接收端,我們需要實作一個處理程式來處理指令。
```csharp public class CommandHandler : IRequestHandler<CreateUser, string> { public Task<string> Handle(CreateUser request, CancellationToken cancellationToken) { return Task.FromResult("User Created"); } } ```
3. CQRS 模式簡介
Command Query Responsibility Segregation(CQRS)是一種模式,它要求我們将系統中的指令(寫操作)與查詢(讀操作)分離。
```csharp public interface ICommand<T> : IRequest<T> { } public interface IQuery<T> : IRequest<T> { } public record CreateOrder : ICommand<string> { public int Id { get; set; } public int CustomerId { get; set; } } public record GetOrder : IQuery<Order> { public int OrderId { get; set; } } ```
4. 源代碼生成器
源代碼生成器是 Roslyn 編譯器的一個特性,它允許我們在編譯過程中生成額外的代碼。
```csharp [Generator] public class MySourceGenerator : ISourceGenerator { public void Execute(GeneratorExecutionContext context) { // 檢查文法樹并生成新的 C# 源代碼 } public void Initialize(GeneratorInitializationContext context) { // 初始化生成器 } } ```
5. 源代碼生成器與 MediatR 和 CQRS 結合
我們可以建立一個源代碼生成器,它将自動為我們的 Command 和 Query 生成相應的 ASP.NET Core 控制器和 Action 方法。
```csharp [Route("api/[controller]/[Action]")] [ApiController] public class CommandController : ControllerBase { private readonly IMediator _mediator; public CommandController(IMediator mediator) { _mediator = mediator; } [HttpPost] [Produces("application/json")] [ProducesResponseType(typeof(string), StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task<string> CreateOrder([FromBody] CreateOrder command) { return await _mediator.Send(command); } [HttpPost] [Produces("application/json")] [ProducesResponseType(typeof(Order), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task<Order> GetOrder([FromBody] GetOrder command) { return await _mediator.Send(command); } } ```
6. 使用 OpenAPI 生成 API 文檔
通過 Swashbuckle,我們可以為自動生成的 API 控制器生成 OpenAPI(Swagger)文檔。
```csharp public void ConfigureServices(IServiceCollection services) { services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); }); } ```
通過源代碼生成器,我們可以顯著減少需要手動編寫的代碼量,提高開發效率并降低出錯率。結合 MediatR 和 CQRS 模式,我們可以建立一個清晰、可維護的應用程式架構。