NetCore3.0实现自定义IOC容器注入

原文:NetCore3.0实现自定义IOC容器注入

在之前的ASP.NET MVC实现依赖注入一文中,通过替换默认的ControllerFactory来达到对Controller生命周期的拦截,实现自定义的对象注入,在NetCore3.0中需要重新实现,步骤如下:

1.获取所有相关业务程序集

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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组件注册

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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工厂

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

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工厂

?


1

2

3

4

5

6

7

//替换默认Controller工厂

var defaultActivator = services.FirstOrDefault(c => c.ServiceType == typeof(IControllerActivator));

if (defaultActivator != null)

{

    services.Remove(defaultActivator);

}

services.AddSingleton<IControllerActivator, CloudControllerActivator>();

原文地址:https://www.cnblogs.com/lonelyxmas/p/12264594.html

时间: 2024-10-29 14:27:43

NetCore3.0实现自定义IOC容器注入的相关文章

Spring为IOC容器注入Bean的五种方式

一 @Import导入组件,id默认是组件的全类名 1 //类中组件统一设置.满足当前条件,这个类中配置的所有bean注册才能生效: 2 @Conditional({WindowsCondition.class}) 3 @Configuration 4 @Import({Color.class,Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class}) 5 //@Import导入组件,id默认是组件的全类名 6

Spring之IOC容器注入

上一篇做了IOC和AOP的原理介绍,这一篇主要讲解IOC的注入.不过我依然困惑一个问题: 一 : 依赖注入(DI)中有三种注入方式,那Spring中到底实现了几种方式?也是三种? IOC在很多框架中都有实现,并不是Spring特有的,之前说过IOC主要包含DL(Dependency Lookup)和DI(Dependency Injection),也就是说实现IOC的技术有很多,但是主要包含DI和DL,但是相对而言,DI应用范围比较广泛,我想这也是为什么Martin Fowler将控制反转用依赖

Spring学习第0节 -- 核心技术Ioc容器、IOC理解

耦合与内聚 耦合是指模块间的依赖关系, 内聚是指模块内组件的交互程度 如果模块间依赖程度很高,那么在多人合作编程中,一个人的工作会很容易的受到另一个人工作的波及.   反射 Java反射机制是指在运行状态下,完成对类相关信息的访问,对该类实例对象进行任何操作的功能   IOC控制反转 Inverse Of Control 是一种面向对象编程中的设计原则,用来降低代码之间的耦合度. 控制的反转是指原先是在硬编码中对于程序运行状态进行控制,而控制反转之后,程序的具体运行交由了运行时具体加载的类来完成

Spring IOC之注入

1.概念 控制权的转移,应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护 简而言之: 把本身可以创建对象的权利交给IOC容器,当要实例化该对象的时候,由IOC容器来实例化该对象(专注于使用IOC创建的对象) 2.目的 创建对象并且组装对象之间的关系 3.步骤 1.Bean容器初始化 (即IOC容器加载beans的xml配置文件)  (加载并初始化配置文件<beans></beans>) 1.两个基础包 1.org.springframework.beans 1.

springboot启动流程(八)ioc容器refresh过程(下篇)

所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 上一篇文章,我们知道了解析过程将从解析main方法所在的主类开始.在文章的最后我们稍微看了一下ConfigurationClassParser这个解析器的parse方法 protected final void parse(AnnotationMetadata metadata, String beanName) throws IOException { processConfigur

Spring的IOC容器—依赖注入

前面一篇博客大致讲了一下Spring的IOC容器的原理,IOC即控制反转主要是依靠依赖注入的方式来实现的.依赖注入是指所依赖的对象不是由自己new出来的,而是用别的方式像打针似的注入进来. 其实说白了不管是控制反转还是依赖注入都说明了Spring采用动态.灵活的方式来管理各种对象. Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理.有以下几种注入方式: 1. Setter 注入 因为对于javaBean来说,我们可以通过setter和getter方法

理解PHP 依赖注入|Laravel IoC容器

看Laravel的IoC容器文档只是介绍实例,但是没有说原理,之前用MVC框架都没有在意这个概念,无意中在phalcon的文档中看到这个详细的介绍,感觉豁然开朗,复制粘贴过来,主要是好久没有写东西了,现在确实很懒变得! 首先,我们假设,我们要开发一个组件命名为SomeComponent.这个组件中现在将要注入一个数据库连接. 在这个例子中,数据库连接在component中被创建,这种方法是不切实际的,这样做的话,我们将不能改变数据库连接参数及数据库类型等一些参数. 01 <?php 02   0

IoC 依赖注入容器 Unity

原文:IoC 依赖注入容器 Unity IoC 是什么? 在软件工程领域,“控制反转(Inversion of Control,缩写为IoC)”是一种编程技术,表述在面向对象编程中,可描述为在编译时静态分析器并不知道具体被耦合的对象,而该对象是在运行时被对象装配器绑定的. 在传统编程中,决定业务流程的对象是被静态分配的.而在 IoC 中,业务流程取决于对象装配器实例化提供的对象,这使利用抽象来定义对象间的交互成为可能.对象装配器为了能绑定一个对象,要求该对象必须具备兼容的抽象定义.例如类 Cla

ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入

在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就是指使用者,下层就是指被使用者. 二.IoC控制反转 控制反转(IoC,全称Inversion of Control)是一种思想,所谓“控制反转”,就是反转获得依赖对象的过程. 三.依赖注入(DI) 依赖注入设计模式是一种在类及其依赖对象之间实现控制反转(IoC)思想的技术. 所谓依赖注入(DI,全