前言
我們在《.NET 6新特性試用》中講過,隨著項目需求和復雜性的增加,單個文件的最小 WEB API 會變得非常臃腫。
而且,Program.cs 應該只放啟動和初始化代碼。不應該包含太多 MapXXX
方法。
那么,如何以更好的方式組織最小 WEB API 代碼結構呢?
1. 靜態幫助類
可以將它們移到單獨的類中。
例如,你可以創建一個名為 MinimalApiHelper 的靜態類并向其添加靜態方法:
public?static?class?MinimalApiHelper
{public?static?void?RegisterWeatherForecastAPIs(WebApplication?app){var?summaries?=?new[]{"Freezing",?"Bracing",?"Chilly",?"Cool",?"Mild",?"Warm",?"Balmy",?"Hot",?"Sweltering",?"Scorching"};app.MapGet("/weatherforecast",?()?=>{......}).WithName("GetWeatherForecast");}
}
Program.cs 修改如下:
......app.UseHttpsRedirection();MinimalApiHelper.RegisterWeatherForecastAPIs(app);app.Run();
2. 擴展方法
更進一步,可以將這些靜態方法創建為 WebApplication 類的擴展方法:
public?static?void?RegisterWeatherForecastAPIs(this?WebApplication?app)
{......
}
可以像這樣簡化調用代碼:
......app.RegisterWeatherForecastAPIs();app.Run();
3. 依賴注入
但是,存在大量服務時,需要多次執行注冊代碼:
app.RegisterService1APIs();
app.RegisterService2APIs();
......
我們可以使用依賴注入簡化注冊代碼。
實現代碼如下:
public??static?class?MinimalApiExtentions
{public?static?void?AddMinimalApiRegisters(this?IServiceCollection?services,?params?Type[]?types){var?registers?=?new?List<IMinimalApiRegister>();foreach?(var?type?in?types){registers.AddRange(type.Assembly.GetTypes().Where(x?=>?typeof(IMinimalApiRegister).IsAssignableFrom(x)?&&?!x.IsInterface?&&?!x.IsAbstract).Select(Activator.CreateInstance).Cast<IMinimalApiRegister>());}services.AddSingleton<IEnumerable<IMinimalApiRegister>>(registers);}public?static?void?UseMinimalApiRegisters(this?WebApplication?app){var?registers?=?app.Services.GetRequiredService<IEnumerable<IMinimalApiRegister>>();foreach?(var?register?in?registers){register.RegisterAPIs(app);}}
}
Program.cs 修改如下:
var?builder?=?WebApplication.CreateBuilder(args);
builder.Services.AddMinimalApiRegisters(typeof(Program));var?app?=?builder.Build();
app.UseMinimalApiRegisters();
app.Run();
遍歷程序集中的所有 IMinimalApiRegister
實現類,然后遍歷調用實現類的 RegisterAPIs
方法。
示例實現類如下:
public?class?Service1Register?:?IMinimalApiRegister
{?public?void?RegisterAPIs(WebApplication?app){app.MapGet("/",?()?=>?"Hello?My?IO");}
}
結論
今天,我們介紹了如何組織最小 WEB API 代碼結構。
如果你有更好的方案,歡迎到我的公眾號“My IO”留言討論