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

Util应用框架核心(一) - 服务配置的更多相关文章

  1. ASP.NET Core的身份认证框架IdentityServer4--(3)令牌服务配置访问控制跟UI添加

    使用密码保护API OAuth 2.0 资源所有者密码授权允许一个客户端发送用户名和密码到IdentityServer并获得一个表示该用户的可以用于访问api的Token. 该规范建议仅对" ...

  2. 基于Dubbo框架构建分布式服务(一)

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  3. 原创:Equinox OSGi应用嵌入Jersey框架搭建REST服务

    一.环境 eclipse版本:eclipse-luna 4.4 jre版本:1.8 二.Equinox OSGi应用嵌入Jersey框架搭建REST服务 1.新建插件工程HelloWebOSGI a. ...

  4. WCF初探-6:WCF服务配置

    WCF服务配置是WCF服务编程的主要部分.WCF作为分布式开发的基础框架,在定义服务以及定义消费服务的客户端时,都使用了配置文件的方法.虽然WCF也提供硬编程的方式,通过在代码中直接设置相关对象的属性 ...

  5. 基于Dubbo框架构建分布式服务

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  6. C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...

  7. C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...

  8. [转载] 基于Dubbo框架构建分布式服务

    转载自http://shiyanjun.cn/archives/1075.html Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务 ...

  9. 自己写的日志框架--linkinLog4j--框架可配置+提性能

    OK,上一篇博客我们已经实现了日志框架的基本的功能,但是还有一个最大的问题就是日志输出地不能重定向,然后一些输出也不可控.那现在我们来实现一个比较完整的日志框架. 设计思路如下: 1,定义一堆常量Li ...

  10. Equinox OSGi应用嵌入Jersey框架搭建REST服务

    原文地址:https://www.cnblogs.com/kira2will/p/5040264.html 一.环境 eclipse版本:eclipse-luna 4.4 jre版本:1.8 二.Eq ...

随机推荐

  1. 《最新出炉》系列入门篇-Python+Playwright自动化测试-9-页面(page)

    1.简介 通过前边的讲解和学习,细心认真地小伙伴或者童鞋们可能发现在Playwright中,没有Element这个概念,只有Page的概念,Page不仅仅指的是某个页面,例如页面间的跳转等,还包含了所 ...

  2. 2021-7-7 Vue的for使用实例

    <!DOCTYPE html> <html> <head> <title> </title> </head> <body& ...

  3. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-13-playwright操作iframe-下篇

    1.简介 通过前边两篇的学习,想必大家已经对iframe有了一定的认识和了解,今天这一篇主要是对iframe做一个总结,主要从iframe的操作(输入框.点击等等)和定位两个方面进行总结. 2.ifr ...

  4. qBittorrent如何运行脚本 BT实现自动改名并方便Jellyfin的搜刮器

    qBittorrent如何运行脚本 BT实现自动改名并方便Jellyfin的搜刮器 很多影视网站下载的视频名字大概是为了规避监测,命名非常奇葩,比如:z灼f流,y骨y等等.如果你使用了Jellyfin ...

  5. ETL之apache hop系列3-hop Server环境部署与客户端发布管道工作流

    前言 该文档主要是apache hop 2.5的 Windows 10和Linux docker环境部署和客户端发布工作流和管道的相关内容 不使用Docker直接使用应用程序包,下载压缩包文件后,需要 ...

  6. 使用 Rancher 安装 K8s 集群

    舞台环境 Ubuntu 22.04.2 LTS Docker 24.0.2 2GB RAM或者更多 CPU 2核心或者更多 Rancher 2.6.9 测试环境中,我准备了两台 Ubuntu 服务器, ...

  7. (洛谷P4213)杜教筛

    https://www.cnblogs.com/Mychael/p/8744633.html #pragma GCC optimize(3, "Ofast", "inli ...

  8. 从壹开始前后端开发【.Net6+Vue3】(二)前端框架

    项目名称:KeepGoing(继续前进) 介绍 工作后,学习的脚步一直停停走走,希望可以以此项目为基础,可以不断的迫使自己不断的学习以及成长 将以Girvs框架为基础,从壹开始二次开发一个前后端管理框 ...

  9. iOS添加图片

    添加一个按钮 将图片添加到

  10. TypeScript中Class基础使用

    TypeScript是一种静态类型的JavaScript超集,它提供了许多增强的功能,其中之一就是对面向对象编程的支持.在TypeScript中,我们可以使用Class来定义类,这使得我们能够更加结构 ...