本文介紹在專案中如何配置 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;
}
}