首页 > 其他分享 >Util应用框架核心(一) - 服务配置

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

时间:2023-10-29 14:36:32浏览次数:30  
标签:IAppBuilder 框架 扩展 builder 配置 生成器 Util public

本文介绍在项目中如何配置 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;
    }
}

标签:IAppBuilder,框架,扩展,builder,配置,生成器,Util,public
From: https://www.cnblogs.com/xiadao521/p/17795840.html

相关文章

  • 【Asp.net】Asp.net core中IIS配置注意事项一、提示:关于IIS上运行ASP.NET Core 站点的
    1、应用地址池设为无托管代码一、提示:关于IIS上运行ASP.NETCore站点的“HTTP500.19”错误安装dotnet-hosting-3.1.2-win.exeASP.NETCore3.1Runtime(v3.1.2)下载地址:https://download.visualstudio.microsoft.com/download/pr/dd119832-dc46-4ccf-bc12-69e7bfa61b18/990843c6......
  • RKE2 config containerd private registry (rke2配置私有仓库地址)
    文章目录1.预备条件2.配置镜像仓库1.预备条件安装rke2:博客:rke2在线部署kubernetes官网:https://docs.rke2.io/install/quickstart2.配置镜像仓库Containerd可以配置为连接到私有镜像仓库,并使用仓库在每个节点上拉取私有镜像。启动时,RKE2会检查/etc/rancher/rke2/中是......
  • 【1】Anaconda3 和jupter安装与配置
    1、Anacond的介绍Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包,Anaconda的下载文件比较大(约531MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小的发行版(仅包含conda和Python)。......
  • 021-Qt 配置GitHub Copilot
    Qt配置GitHubCopilot文章目录Qt配置GitHubCopilot项目介绍GitHubCopilot配置GitHubCopilotQt前置条件升级QtGitHubCopilot前置条件激活的了GitHubCopilot账号安装Neovim启用插件,重启Qt配置GitHubCopilo安装Nodejs下载[copilot.vim](https://github.com/github/copil......
  • 收藏从未停止,练习从未开始——MYSQL游标存储过程IDEA快捷键配置SpringBoot入门到入土G
    “收藏从未停止,练习从未开始”,或许有那么一些好题好方法,在被你选中收藏后却遗忘在收藏夹里积起了灰?今天请务必打开你沉甸甸的收藏重新回顾,分享一下那些曾让你拍案叫绝的好东西吧!本人详解:(提醒:随笔)本人详解作者:王文峰,参加过2020年度博客之星,《Java王大师王天师》作者采购供应链共享......
  • Android|集成 slf4j + logback 作为日志框架
    最近在做一个AndroidAPP的日志改造时,想要满足如下需求:能够很方便地使用可变参数的方式输出日志;日志能够根据级别输出到控制台和文件;能够按照日期和文件大小进行日志文件的切割,滚动保存指定天数的日志,自动清理旧日志。基于这个需求,我搜了一下「Android日志框架」,大多网友推荐的......
  • ensp 简单配置路由添加ip操作小实例
    ensp简单配置路由添加ip操作displaycu#查看路由器配置displayiprouting-table[x.x.x.x]#查看路由表【和x.x.x.x相关的条】案例一、2个路由器配置ip地址给2个路由器配合ip地址,方法一样ipaddressx.x.x.x.x掩码24(255.225.255.0)1.启动2个路由器,有......
  • rust ui lib 跨平台ui框架
    部分条目未更新,请自行到项目主页查看。框架StarsIssue活跃程度版本TauriStarIssueegui+bevyStarIssueSlintStarIssueIcedDioxusGTKFlutter框架网页手机PC嵌入式额外语言Taurieguibe......
  • 一个轻量级golang ORM框架gdbcTemplate
    今天介绍一个自己写的轻量级golangORM框架gdbcTemplate,目前支持mysql,postgresql等数据库项目地址位于https://github.com/guoapeng/gdbctemplate以下摘自readme文件,里面有示例供参考.1.readmefilealightweightgolangORMframeworksimilartojdbcinjavatech......
  • 线程池的线程数应该怎么配置?有哪几种常见的线程池?
    一、线程池的线程数应该怎么配置?线程在Java中属于稀缺资源,线程池不是越大越好也不是越小越好。任务分为计算密集型、IO密集型、混合型。1.计算密集型:大部分都在用CPU跟内存,加密,逻辑操作业务处理等。2.IO密集型:数据库链接,网络通讯传输等。一般的经验,不同类型线程池的参数配置:1、......