本文介绍在项目中如何配置 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. 基于GPT搭建私有知识库聊天机器人(三)向量数据训练

    在前面的文章中,我们介绍了实现原理和基本环境安装.本文将重点介绍数据训练的流程,以及如何加载.切割.训练数据,并使用向量数据库Milvus进行数据存储. 1. 数据训练依赖于向量数据库 在本文中,我们 ...

  2. Linux快速安装流量监控工具(实用版)

    前言: Linux流量监控工具,在此我推荐两种分别为: 1.nload(推荐)因为个人看着舒服点 2.iftop 以上两种任选其一即可,在此对两种都有介绍和安装教程,我写了,大家随意哈 nload安装 ...

  3. [爬虫]1.2.1 HTML标签和属性

    HTML(HyperText Markup Language)是一种用于创建网页的标记语言.HTML文档由一系列的HTML标签构成,每个标签都有自己的意义和用途.HTML标签通常成对出现,由一个开始标 ...

  4. 2023-7-27WPF的ContextMenu的传参绑定方式

    WPF的ContextMenu的绑定方式 [作者]长生 ContextMenu为何不能正常绑定 在wpf中ContextMenu和ToolTip一样都是弹出层,与VisualTree已经分离了,只不过 ...

  5. Cilium系列-8-绕过 IPTables 连接跟踪

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...

  6. opencv-python中 boundingRect(cnt)以及cv2.rectangle用法

    矩形边框(Bounding Rectangle)是说,用一个最小的矩形,把找到的形状包起来.还有一个带旋转的矩形,面积会更小,效果见下图 首先介绍下cv2.boundingRect(img)这个函数 ...

  7. p2:认识requests库的常用方法与实战

    二.全面认识requests库的常用方法 requests是python第三方库安装命令方法如下: pip install requests python的默认的测试用来规则 1.模块名必须以test ...

  8. openlayers学习笔记

    https://www.cnblogs.com/suRimn/p/10649816.html

  9. java file I/O流

    一.File的简介:(java.io包) 生活中的文件: (1)文件的作用:持久化(瞬时状态的对立面状态) (1)文件的定义:一堆数据的集合 (2)文件存储的位置:磁盘,硬盘,软盘,U盘等等 计算机中 ...

  10. java与es8实战之六:用JSON创建请求对象(比builder pattern更加直观简洁)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<java与es8实战>系 ...