Util应用框架核心(一)- 服务配置

框架核心

本节介绍Util应用框架的核心构造块,它们是Util项目运行的基础设施.

服务配置

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扩展方法

已为 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值