Util應用框架核心(一) - 服務配置
本文介紹在項目中如何配置 Util 依賴服務.
文章分為多個小節,如果對設計原理不感興趣,只需要閱讀基礎用法部分即可.
基礎用法
Asp.Net Core 項目服務配置
調用 WebApplicationBuilder 實例的 AsBuild 方法, 并以鏈式調用Util服務擴展.
范例
var builder = WebApplication.CreateBuilder( args );
builder.AsBuild()
.AddAop()
.AddUtc()
.AddSerilog()
.AddSqlServerUnitOfWork<IDemoUnitOfWork,DemoUnitOfWork>( builder.Configuration.GetConnectionString( "DefaultConnection" ) )
.AddUtil();
控制臺項目服務配置
調用 IHostBuilder 實例的 AsBuild 方法, 并以鏈式調用Util服務擴展.
范例
Host.CreateDefaultBuilder( args )
.AsBuild()
.AddSerilog()
.AddUtil()
.Build()
.Run();
設計動機
.Net 默認的服務配置方式是在 IServiceCollection 實例調用服務擴展方法.
下面的代碼用于添加Asp.Net Core Web Api控制器服務.
var builder = WebApplication.CreateBuilder( args );
builder.Services.AddControllers();
.Net 在 IServiceCollection 上擴展了大量的服務配置方法.
不僅如此,第三方類庫也會添加自己的服務擴展到 IServiceCollection .
最少記憶原則是應用框架設計原則之一.
應用框架的封裝,應盡量減少開發人員需要記憶的內容.
代碼提示能夠幫助開發人員記憶.
大量的擴展方法降低了代碼提示的作用,在不看文檔的情況下,你很難知道哪些服務擴展是 Util應用框架相關的.
Util應用框架定義了用來專門聚集服務配置的接口 IAppBuilder,從而將Util應用框架提供的服務配置方法從 IServiceCollection 分離出來.
AsBuild 方法返回 IAppBuilder 實例,現在你只需有個模糊的印象就能調用Util應用框架提供的服務配置方法.
源碼解析
AppBuilder
AppBuilder 是 IHostBuilder 的簡單包裝.
/// <summary>
/// 應用生成器
/// </summary>
public interface IAppBuilder {
/// <summary>
/// 主機生成器
/// </summary>
public IHostBuilder Host { get; }
/// <summary>
/// 構建
/// </summary>
public IHost Build();
}
/// <summary>
/// 應用生成器
/// </summary>
public class AppBuilder : IAppBuilder {
/// <summary>
/// 初始化應用生成器
/// </summary>
/// <param name="host">主機生成器</param>
public AppBuilder( IHostBuilder host ) {
Host = host ?? throw new ArgumentNullException( nameof( host ) );
}
/// <inheritdoc />
public IHostBuilder Host { get; }
/// <summary>
/// 構建
/// </summary>
public IHost Build() {
return Host.Build();
}
}
AsBuild擴展方法
已為 IHostBuilder 和 WebApplicationBuilder 添加 AsBuild擴展方法.
/// <summary>
/// 主機生成器服務擴展
/// </summary>
public static class IHostBuilderExtensions {
/// <summary>
/// 轉換為Util應用生成器
/// </summary>
/// <param name="hostBuilder">主機生成器</param>
public static IAppBuilder AsBuild( this IHostBuilder hostBuilder ) {
hostBuilder.CheckNull( nameof( hostBuilder ) );
return new AppBuilder( hostBuilder );
}
}
/// <summary>
/// Web應用生成器擴展
/// </summary>
public static class WebApplicationBuilderExtensions {
/// <summary>
/// 轉換為Util應用生成器
/// </summary>
/// <param name="builder">Web應用生成器</param>
public static IAppBuilder AsBuild( this WebApplicationBuilder builder ) {
builder.CheckNull( nameof( builder ) );
return new AppBuilder( builder.Host );
}
}
服務配置擴展
當 Util 應用框架內置功能無法滿足你的需求時,可以自行擴展.
如果擴展功能需要進行配置,可以擴展到 IAppBuilder,以方便調用.
創建 AppBuilderExtensions 靜態類, 為 IAppBuilder 添加服務擴展方法.
約定,服務配置名稱應以 Add 開頭.
IAppBuilder 可以獲取 IHostBuilder 實例,調用它的 ConfigureServices 方法進行配置.
服務配置擴展范例
/// <summary>
/// 業務鎖操作擴展
/// </summary>
public static class AppBuilderExtensions {
/// <summary>
/// 配置業務鎖
/// </summary>
/// <param name="builder">應用生成器</param>
public static IAppBuilder AddLock( this IAppBuilder builder ) {
builder.CheckNull( nameof( builder ) );
builder.Host.ConfigureServices( ( context, services ) => {
services.TryAddTransient<ILock, DefaultLock>();
} );
return builder;
}
}

浙公網安備 33010602011771號