框架核心
本节介绍 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 扩展方法
已为 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;
}
}
复制代码
评论