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扩展方法
已为 IHostBuilder 和 WebApplicationBuilder 添加 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应用框架核心(一) - 服务配置的更多相关文章
- ASP.NET Core的身份认证框架IdentityServer4--(3)令牌服务配置访问控制跟UI添加
使用密码保护API OAuth 2.0 资源所有者密码授权允许一个客户端发送用户名和密码到IdentityServer并获得一个表示该用户的可以用于访问api的Token. 该规范建议仅对" ...
- 基于Dubbo框架构建分布式服务(一)
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- 原创:Equinox OSGi应用嵌入Jersey框架搭建REST服务
一.环境 eclipse版本:eclipse-luna 4.4 jre版本:1.8 二.Equinox OSGi应用嵌入Jersey框架搭建REST服务 1.新建插件工程HelloWebOSGI a. ...
- WCF初探-6:WCF服务配置
WCF服务配置是WCF服务编程的主要部分.WCF作为分布式开发的基础框架,在定义服务以及定义消费服务的客户端时,都使用了配置文件的方法.虽然WCF也提供硬编程的方式,通过在代码中直接设置相关对象的属性 ...
- 基于Dubbo框架构建分布式服务
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...
- C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(下)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...
- [转载] 基于Dubbo框架构建分布式服务
转载自http://shiyanjun.cn/archives/1075.html Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务 ...
- 自己写的日志框架--linkinLog4j--框架可配置+提性能
OK,上一篇博客我们已经实现了日志框架的基本的功能,但是还有一个最大的问题就是日志输出地不能重定向,然后一些输出也不可控.那现在我们来实现一个比较完整的日志框架. 设计思路如下: 1,定义一堆常量Li ...
- Equinox OSGi应用嵌入Jersey框架搭建REST服务
原文地址:https://www.cnblogs.com/kira2will/p/5040264.html 一.环境 eclipse版本:eclipse-luna 4.4 jre版本:1.8 二.Eq ...
随机推荐
- Open LLM 排行榜近况
Open LLM 排行榜是 Hugging Face 设立的一个用于评测开放大语言模型的公开榜单.最近,随着 Falcon 的发布并在 Open LLM 排行榜 上疯狂屠榜,围绕这个榜单在推特上掀起了 ...
- 【原创】Ftrace使用及实现机制
Ftrace使用及实现机制 版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100 如有错误,欢迎指正. 目录 Ftrace使用及实现机制 ...
- Debian12配置NTP时间同步
环境 查看系统版本:lsb_release -a 配置NTP时间同步 下面的配置需要用到管理员权限,可以使用su切换到管理员权限. 查看/修正 时区 查看系统时区:timedatectl 如果时区不是 ...
- VueJS使用addEventListener的事件如何触发执行函数的this
1.使用浏览器监听切屏为例 此处为考虑浏览器兼容性推荐使用:document.addEventListener 1.1.正常函数使用如下: let n = 0; let max = 3; // 切屏最 ...
- 可托拉拽的WPF选项卡控件,强大好用!
推荐一个简单易用的WPF选项卡控件. 项目简介 这是一个基于WPF开发的,可扩展.高度可定制.轻量级的UI组件,支持拖拉拽功能,可以让开发人员快速实现需要选项卡窗口的系统. 特色功能 1.拖拉拽标签: ...
- 【pandas小技巧】--字符串转数值
字符串转数字的用途和场景很多,其中主要包括以下几个方面: 数据清洗:在进行数据处理时,经常会遇到一些数据类型不匹配的问题,比如某些列中的字符串类型被误认为是数字类型,此时需要将这些字符串类型转换为数字 ...
- css里的position的static|relative|absolute|fixed的区别
前提:仅以div块为例,其它不清楚 注:1.下面截图看起来不是从页面左上角位置开始,是因为body元素有默认的margin,有边框 2.当position不是static时,top和bottom需要指 ...
- Airtest的iOS实用接口介绍
1. 前言 前段时间Airtest更新了1.3.0.1版本,里面涉及非常多的iOS功能新增和改动,今天想详细跟大家聊一下里面的iOS设备接口. PS:本文示例均使用本地连接的iOS设备,Airtest ...
- 高性能MySQL实战(一):表结构
最近因需求改动新增了一些数据库表,但是在定义表结构时,具体列属性的选择有些不知其所以然,索引的添加也有遗漏和不规范的地方,所以我打算为创建一个高性能表的过程以实战的形式写一个专题,以此来学习和巩固这些 ...
- Redis从入门到放弃(11):雪崩、击穿、穿透
1.前言 Redis作为一款高性能的缓存数据库,为许多应用提供了快速的数据访问和存储能力.然而,在使用Redis时,我们不可避免地会面对一些常见的问题,如缓存雪崩.缓存穿透和缓存击穿.本文将深入探讨这 ...