NetCore3.0实现自定义IOC容器注入
在之前的ASP.NET MVC实现依赖注入一文中,通过替换默认的ControllerFactory来达到对Controller生命周期的拦截,实现自定义的对象注入,在NetCore3.0中需要重新实现,步骤如下:
1.获取所有相关业务程序集
public static List<Assembly> GetFrameworkAssemblys()
{
var list = new List<Assembly>();
var deps = DependencyContext.Default;
var libs = deps.CompileLibraries;
foreach (var lib in libs)
{
if (!lib.Serviceable && lib.Type != "package" && lib.Name.StartsWith("FastCloud"))
{
var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName(lib.Name));
list.Add(assembly);
}
}
return list;
}
2.对所有Component组件注册
public class InjectContext
{
private static ContainerBuilder Container;
public static void Init()
{
InjectFrameWork();
} public static void InjectFrameWork()
{
Container = new ContainerBuilder();
//获框架取所有程序集
List<Assembly> assemblies = CloudUtil.GetFrameworkAssemblys();
//注入框架所有Component组件
Container.RegisterAssemblyTypes(assemblies.ToArray(), typeof(Component), true);
Container.Build(CotainerEnum.BuidlModel.OverWrite);
} public static object Resolve(Type Type, CotainerEnum.TypeEqual TypeEqual = CotainerEnum.TypeEqual.Ref)
{
return Container.Resolve(Type, TypeEqual);
} public static List<Type> GetRegistType(Type @Type)
{
return Container.GetRegistType(@Type);
}
}
3.实现自定义Controller工厂
public class CloudControllerActivator : IControllerActivator
{
public object Create(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
} if (context.ActionDescriptor == null)
{
throw new ArgumentException(nameof(ControllerContext.ActionDescriptor));
} var controllerTypeInfo = context.ActionDescriptor.ControllerTypeInfo; if (controllerTypeInfo == null)
{
throw new ArgumentException(nameof(context.ActionDescriptor.ControllerTypeInfo));
} Type controllerType = controllerTypeInfo.AsType();
return InjectContext.Resolve(controllerType);
} public void Release(ControllerContext context, object controller)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
} if (controller == null)
{
throw new ArgumentNullException(nameof(controller));
} var disposable = controller as IDisposable;
if (disposable != null)
{
disposable.Dispose();
} }
}
4.修改配置,使用自定义Controller工厂
//替换默认Controller工厂
var defaultActivator = services.FirstOrDefault(c => c.ServiceType == typeof(IControllerActivator));
if (defaultActivator != null)
{
services.Remove(defaultActivator);
}
services.AddSingleton<IControllerActivator, CloudControllerActivator>();
NetCore3.0实现自定义IOC容器注入的更多相关文章
- Spring源码-IOC部分-自定义IOC容器及Bean解析注册【4】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Spring的IoC容器注入的类型
Spring除了可以注入Bean实例外,还可以注入其他数据类型. 注入基本数据类型 xml配置文件中的init-method="init"属性是取得Bean实例之后,输入属性值后自 ...
- 【Spring】Spring之向 IOC 容器注入对象的三种方式
关于Spring的搭建可参见:浅析Spring框架的搭建.在测试之前还是应该先将环境配置好,将相关Jar包导进来.Spring创建的对象,默认情况下都是单例模式,除非通过scope指定. 向IOC容器 ...
- Spring为IOC容器注入Bean的五种方式
一 @Import导入组件,id默认是组件的全类名 //类中组件统一设置.满足当前条件,这个类中配置的所有bean注册才能生效: @Conditional({WindowsCondition.clas ...
- 【最简单IOC容器实现】实现一个最简单的IOC容器
前面DebugLZQ的两篇博文: 浅谈IOC--说清楚IOC是什么 IoC Container Benchmark - Performance comparison 在浅谈IOC--说清楚IOC是什么 ...
- Spring 源码剖析IOC容器(一)概览
目录 一.容器概述 二.核心类源码解读 三.模拟容器获取Bean ======================= 一.容器概述 spring IOC控制反转,又称为DI依赖注入:大体是先初始化bean ...
- Spring IOC容器启动流程源码解析(一)——容器概念详解及源码初探
目录 1. 前言 1.1 IOC容器到底是什么 1.2 BeanFactory和ApplicationContext的联系以及区别 1.3 解读IOC容器启动流程的意义 1.4 如何有效的阅读源码 2 ...
- Spring ioc容器
一.ioc容器 ioc (inversion of control)即控制反转,把某一个接口选择实现类的控制权转移给Spring容器来管理.调用类对该实现类的依赖关系由ioc容器注入(DI),传统的 ...
- IoC容器Autofac之IOC/DI基本概念(二)
原文:http://www.cnblogs.com/xdp-gacl/p/4249939.html 1.1.IoC是什么 Ioc—Inversion of Control,即“控制反转”,一种设计思想 ...
随机推荐
- log4j的xml配置
主要记录下方便下次查找 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:conf ...
- 使用Razor表达式 使用条件语句 来自 精通ASP-NET-MVC-5-弗瑞曼
- mysql输出到页面MVC模式
上一篇文章我提到过在jsp页面不好 这篇文章讲的就是界面和代码分离,可以初步实现两个或三个人合作完成一个项目 好,废话不多说,进正题 这次又四个步骤 第一步,新建项目,新建实体类 第二步,新建数据库, ...
- git--->Git中.gitignore配置
Git中.gitignore文件不起作用的解决以及Git中的忽略规则介绍 在Studio里使用Git管理代码的过程中,可以修改.gitignore文件中的标示的方法来忽略开发者想忽略掉的文件或目录,如 ...
- 【WPF学习】第三十章 元素绑定——绑定到非元素对象
前面章节一直都在讨论如何添加链接两个各元素的绑定.但在数据驱动的应用程序中,更常见的情况是创建从不可见对象中提取数据的绑定表达式.唯一的要求是希望显示的信息必须存储在公有属性中.WPF数据绑定数据结构 ...
- js实现表单的提交
<form action="" method="post" name="form"> <tr> ...
- 使用Qt自动注册Lav
Qt播放视频使用QMediaPlayer要注册Lav解码器,如果手动去注册,每次去使用管理员运行命令或者生成.bat文件都比较麻烦. 解决方法步骤如下: 一:编写注册Lav解码器脚本,并取消控制台的显 ...
- ros机器人之动作(二)
前面我们实现了动作的定义,接下来实现动作的功能 实现一个基本的动作服务器 准备好所需的动作定义后就可以开始编写代码了.动作和话题一样,都是使用回调机制,即回调函数会在收到消息时被唤醒和调用. 例:si ...
- 简单处理IP XML数据
///* 编译环境: visual c++ */ //#include <stdio.h> //#include <winsock2.h> //#pragma comment( ...
- HDU_1175_莫队+逆元
http://acm.hdu.edu.cn/showproblem.php?pid=5145 初探莫队,就是离线排序后的暴力,但是效率大大提高,中间要除法取模,所以用到了逆元. #include< ...