10分钟 Castle.Windsor 适配 Asp.Net Core 3.0
Asp.Net Core 3.0以上,不再能通过修改Starup.ConfigureServices返回值(IServiceProvider),所以只能调用IHostBuilder.UseServiceProviderFactory修改最外层的IServiceProviderFactory,达到替换DI容器的目的。
流程是IHostBuilder.UseServiceProviderFactory->IHostBuilder.ConfigureServices->Starup.ConfigureServices,而且IHostBuilder.UseServiceProviderFactory不支持依赖注入,所以只能实例化了,不能取巧的IHostBuilder.ConfigureServices内注册IServiceProviderFactory。
配置Windsor注册模块
public interface IWindsorContainerModule
{
void Configure(WindsorContainer container);
}
这块不支持依赖注入,详情参考上文
自定义DI容器
核心模块 WindsorRegistrationHelper.CreateServiceProvider ,引用Nuget Castle.Windsor.MsDependencyInjection。
internal class WindsorContainerFactory : IServiceProviderFactory<IServiceCollection>
{
private WindsorContainer container;
private IServiceCollection services;
public WindsorContainerFactory(IWindsorContainerModule containerModule)
{
container = new WindsorContainer();
containerModule.Configure(container);
}
public IServiceCollection CreateBuilder(IServiceCollection services)
{
this.services = services;
return services;
}
public IServiceProvider CreateServiceProvider(IServiceCollection containerBuilder)
{
return WindsorRegistrationHelper.CreateServiceProvider(container, services);
}
}
这里完成将Windsor和MS DI注册,统一转换为根节点的IServiceProvider,内部流程独立走Windsor,对外则是MS DI的流程。
IHostBuilder扩展方法
为了调用更简洁易懂,在IHostBuilder上扩展一个UseWindsorContainer方法.
public static IHostBuilder UseWindsorContainer<TWindsorContainerModule>(this IHostBuilder hostBuilder, TWindsorContainerModule containerModule)
where TWindsorContainerModule : class, IWindsorContainerModule
{
return hostBuilder
.UseServiceProviderFactory(new WindsorContainerFactory(containerModule))
.ConfigureServices(services =>
{
services.AddSingleton<IWindsorContainerModule, TWindsorContainerModule>();
});
}
编写示例代码
internal class Sample : IWindsorContainerModule
{
public void Configure(WindsorContainer container)
{
Console.WriteLine("IWindsorContainerModule Instance Name:sample");
container.Register(Component.For(typeof(IHelloInterface)).ImplementedBy(typeof(HelloInterface)).LifestyleSingleton());
}
}
public interface IHelloInterface
{
void Show();
}
internal class HelloInterface : IHelloInterface
{
public void Show()
{
Console.WriteLine(nameof(HelloInterface));
}
}
修改Program.CreateHostBuilder
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseWindsorContainer(new Sample()) //新增
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseStartup<Startup>();
});
修改Controllers.WeatherForecastController.Get
public IEnumerable<WeatherForecast> Get()
{
Console.WriteLine(_helloInterface.GetType().FullName); //打印接口实际实现,验证是否代理到Castle.Windsor
_helloInterface.Show(); //接口调用方法
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
后记
感谢Lemon大人的指点~关于 IHostBuilder.UseServiceProviderFactory到IHostBuilder.ConfigureServices的细节和最初的预估差异不小,最早的代码实现版本是IHostBuilder.ConfigureServices内注册了IServiceProviderFactory,希望更优雅的实现替换DI容器,现实是这块是不可以的~
如果对于内容有交流和学习的,欢迎加 .Net应用程序框架交流群,群号386092459
10分钟 Castle.Windsor 适配 Asp.Net Core 3.0的更多相关文章
- Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...
- ASP.NET Core 1.0 静态文件、路由、自定义中间件、身份验证简介
概述 ASP.NET Core 1.0是ASP.NET的一个重要的重新设计. 例如,在ASP.NET Core中,使用Middleware编写请求管道. ASP.NET Core中间件对HttpCon ...
- Centos7 & Docker & Jenkins & ASP.NET Core 2.0 自动化发布和部署
写在前面 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级 ...
- [译]ASP.NET Core 2.0 会话状态
问题 如何在ASP.NET Core 2.0中存储会话状态? 答案 创建一个空项目,修改Startup类的ConfigureServices()方法,添加会话状态服务和它后台的存储服务: public ...
- Asp.net core 2.0.1 Razor 的使用学习笔记(三)
ASP.net core 2.0.0 中 asp.net identity 2.0.0 的基本使用(二)—用户账户及cookie配置 修改用户账户及cookie配置 一.修改密码强度和用户邮箱验证规则 ...
- [争什么! 掺在一起做撒尿牛丸啊! 笨蛋]ASP.NET Core 2.0 + EF6 + Linux +MySql混搭
好消息!特好消息!同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦! 是的,你没有看错!ASP.NET Core 2.0,.NET Frame ...
- Asp.Net Core 2.0 项目实战(5)Memcached踩坑,基于EnyimMemcachedCore整理MemcachedHelper帮助类。
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- 【Asp.Net Core】ASP.NET Core 2.0 + EF6 + Linux +MySql混搭
好消息!特好消息!同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦! 是的,你没有看错!ASP.NET Core 2.0,.NET Frame ...
- docker 安装jenkins 发布 asp.net core 2.0
安装Docker 其实安装Docker的过程,大家可以到Docker官网找到自己相对应的安装文档进行安装,Docker区分CE和EE的两个版本,具体这两个版本有什么区别,大家自行查阅相关资料,这里不再 ...
随机推荐
- poi excel单元格的校验
switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_NUMERIC://数值类型 if (0 == cell.getCellType()) { ...
- JVM 专题十:运行时数据区(五)堆
1. 核心概述 1.1 堆概述 一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器.本地方法栈和虚拟机栈. 一个jvm实例只存在一个堆内存 ...
- 数据可视化之PowerQuery篇(五)PowerQuery文本处理技巧:移除和提取
https://zhuanlan.zhihu.com/p/64419762 每当拿到原始数据,不如意十有八九,快速准确的清洗数据也是必备技能,数据清洗正好是 PowerQuery 的强项,本文就来介绍 ...
- Producter and Consumer
package pinx.thread; import java.util.LinkedList; import java.util.Queue; public class ProducerConsu ...
- 用CBrother脚本实现smtp协议发送一份邮件
用CBrother脚本实现smtp协议发送一份邮件 之前用CBrother脚本写了一个拯救“小霸王服务器”的程序,公司人用着都挺好用,但是有时候谁重启了服务器其他人不知道,造成了多人多次重启,每个人都 ...
- 十分钟快速搭建Python+Selenium自动化测试环境(含视频教程)
文章首发于微信公众号:爱码小哥 准备安装包: 一:安装python: 双击python-3.7.6.exe执行文件 2.点击下一步正在安装: 3.如图所示表示安装完成: 校验环境是否安装成功: ...
- javascript算法 最短路径问题
var obj = { 1: [2, 3], 2: [1, 4, 5], 3: [1, 7, 8], 4: [2, 7], 7: [4, 8], } var 起点 = 1 var 终点 = 8 var ...
- 高效C++:继承和实现
如何正确的使用继承和实现是本章说明的重点. 确定public继承的关系是is-a public继承等同于is-a 对public继承,所有base的特性,在derived上都适用 避免遮掩继承而来的名 ...
- 遍历map的6种方式
1,平时开发中对map的使用很多,然后发现了很多map可能存在的各种问题:如HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素不断增加,容量 7 次被迫扩大,resize ...
- python爬虫入门(3)----- scrapy
scrapy 简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网络 ...