Util應用框架核心(一) - 服務配置

何鎮汐發表於2023-10-29

本文介紹在專案中如何配置 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擴充套件方法

已為 IHostBuilderWebApplicationBuilder 新增 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;
    }
}

相關文章