写点什么

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

作者:何镇汐
  • 2023-11-11
    四川
  • 本文字数:2004 字

    阅读完需:约 7 分钟

框架核心


本节介绍 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;    }}
复制代码


用户头像

何镇汐

关注

15年以上.Net开发经验,擅长代码封装 2023-11-01 加入

15年以上.Net开发经验,擅长代码封装,主要作品为Util应用框架

评论

发布
暂无评论
Util应用框架核心(一)- 服务配置_开源_何镇汐_InfoQ写作社区