ActivatorUtilities类的CreateFactory要领代码固然较量简朴,可是它涉及到挪用了其他要领,由于嵌套的较量深代码较量多,并且不是本文报告的重点,我们就不再这里细说了,我们能够的描写一下它的事情流程。
首先在给定的范例里查找到符合的结构函数,这里我们可以领略为查找Controller的结构函数。
然后获得结构信息,并获得结构函数的参数与给定范例参数的对应干系
通过结构信息和结构参数的对应干系,在IServiceProvider获得对应范例的实例为结构函数赋值
最后颠末上面的操纵通过初始化指定的结构函数来建设给定Controller范例的实例
综上述的相关步调,我们可以获得一个结论,Controller实例的初始化是通过遍历Controller范例结构函数里的参数,然后按照结构函数每个参数的范例在IServiceProvider查找已经注册到容器中相关的范例实例,最终初始化获得的Controller实例。这就是在IServiceProvider获得需要的依赖干系,然后建设本身的实例,它内部是利用的表达式树来完成的这一切,可以领略为更高效的反射方法。
关于ActivatorUtilities类还包括了其他较量实用的要领,好比CreateInstance要领
public static T CreateInstance<T>(IServiceProvider provider, params object[] parameters)
它可以通过结构注入的方法建设指定范例T的实例,个中结构函数里详细的参数实例是通过在IServiceProvider实例里获取到的,好比我们我们有这么一个类
public class OrderController { private readonly IOrderService _orderService; private readonly IPersonService _personService; public OrderController(IOrderService orderService, IPersonService personService) { _orderService = orderService; _personService = personService; } }
个中它所依赖的IOrderService和IPersonService实例是注册到IOC容器中的
IServiceCollection services = new ServiceCollection() .AddScoped<IPersonService, PersonService>() .AddScoped<IOrderService, OrderService>();
然后你想获取到OrderController的实例,可是它只包括一个有参结构函数,可是结构函数的参数都以注册到IOC容器中。当存在这种场景你便可以通过以下方法获得你想要的范例实例,如下所示
IServiceProvider serviceProvider = services.BuildServiceProvider(); OrderController orderController = ActivatorUtilities.CreateInstance<OrderController>(serviceProvider);
纵然你的范例OrderController并没有注册到IOC容器中,可是它的依赖都在容器中,你也可以通过结构注入的方法获得你想要的实例。总的来说ActivatorUtilities里的要领照旧较量实用的,有乐趣的同学可以自行实验一下,也可以通过查察ActivatorUtilities源码的方法相识它的事情道理。
AddControllersAsServices要领上面我们主要是讲授了默认环境下Controller并不是托管到IOC容器中的,它只是表示出来的让你觉得它是在IOC容器中,因为它可以通过结构函数注入相关实例,这主要是ActivatorUtilities类的功勋。说了这么多Controller实例到底可不行以注册到IOC容器中,让它成为真正受到IOC容器的托管者。要办理这个,必需要满意两点条件
首先,需要将Controller注册到IOC容器中,可是仅仅这样还不足,因为Controller是由ControllerFactory建设而来
其次,我们要改革ControllerFactory类中建设Controller实例的处所让它从容器中获取Controller实例,这样就办理了所有的问题
假如我们本身去实现将Controller托管到IOC容器中,就需要满意以上两个操纵一个是要将Controller放入容器,然后让建设Controller的处所从IOC容器中直接获取Controller实例。名誉的是,微软帮我们封装了一个相关的要领,它可以帮我们办理将Controller托管到IOC容器的问题,它的利用要领如下所示