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


    本文介绍在项目中如何配置 Util 依赖服务.

    文章分为多个小节,如果对设计原理不感兴趣,只需要阅读基础用法部分即可.

    基础用法

    Asp.Net Core 项目服务配置

    调用 WebApplicationBuilder 实例的 AsBuild 方法, 并以链式调用Util服务扩展.

    范例

    var builder = WebApplication.CreateBuilder( args );
    builder.AsBuild()
      .AddAop()
      .AddUtc()
      .AddSerilog()
      .AddSqlServerUnitOfWork( 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 的简单包装.

    /// 
    /// 应用生成器
    /// 
    public interface IAppBuilder {
        /// 
        /// 主机生成器
        /// 
        public IHostBuilder Host { get; }
        /// 
        /// 构建
        /// 
        public IHost Build();
    }
    
    /// 
    /// 应用生成器
    /// 
    public class AppBuilder : IAppBuilder {
        /// 
        /// 初始化应用生成器
        /// 
        /// 主机生成器
        public AppBuilder( IHostBuilder host ) {
            Host = host ?? throw new ArgumentNullException( nameof( host ) );
        }
    
        /// 
        public IHostBuilder Host { get; }
    
        /// 
        /// 构建
        /// 
        public IHost Build() {
            return Host.Build();
        }
    }
    

    AsBuild扩展方法

    已为 IHostBuilderWebApplicationBuilder 添加 AsBuild扩展方法.

    /// 
    /// 主机生成器服务扩展
    /// 
    public static class IHostBuilderExtensions {
        /// 
        /// 转换为Util应用生成器
        /// 
        /// 主机生成器
        public static IAppBuilder AsBuild( this IHostBuilder hostBuilder ) {
            hostBuilder.CheckNull( nameof( hostBuilder ) );
            return new AppBuilder( hostBuilder );
        }
    }
    
    /// 
    /// Web应用生成器扩展
    /// 
    public static class WebApplicationBuilderExtensions {
        /// 
        /// 转换为Util应用生成器
        /// 
        /// Web应用生成器
        public static IAppBuilder AsBuild( this WebApplicationBuilder builder ) {
            builder.CheckNull( nameof( builder ) );
            return new AppBuilder( builder.Host );
        }
    }
    

    服务配置扩展

    当 Util 应用框架内置功能无法满足你的需求时,可以自行扩展.

    如果扩展功能需要进行配置,可以扩展到 IAppBuilder,以方便调用.

    创建 AppBuilderExtensions 静态类, 为 IAppBuilder 添加服务扩展方法.

    约定,服务配置名称应以 Add 开头.

    IAppBuilder 可以获取 IHostBuilder 实例,调用它的 ConfigureServices 方法进行配置.

    服务配置扩展范例

    /// 
    /// 业务锁操作扩展
    /// 
    public static class AppBuilderExtensions {
        /// 
        /// 配置业务锁
        /// 
        /// 应用生成器
        public static IAppBuilder AddLock( this IAppBuilder builder ) {
            builder.CheckNull( nameof( builder ) );
            builder.Host.ConfigureServices( ( context, services ) => {
                services.TryAddTransient();
            } );
            return builder;
        }
    }
    
  • 相关阅读:
    如何显示物品词缀?
    ROS机械臂 Movelt 学习笔记2 | Move Group 接口 C++
    java EE初阶 — Thread类及常见方法
    【Git】如何在微信小程序中使用码云(Gitee)实现远程代码仓库与本地同步?(新手图文教程)
    jvm初识
    PHP基于thinkphp的网上图书管理系统#毕业设计
    比特币上的 zk-SNARKs
    Python自动化测试框架有哪些?
    一步一步搭建,功能最全的权限管理系统之动态路由菜单(一)
    CTFHub | Cookie注入
  • 原文地址:https://www.cnblogs.com/xiadao521/p/17795840.html