解析ASP.NET 5的动态IoC控制器

本文关键字:动态 IoC 控制器 ASP NET 解析 | 更新日期: 2023-09-27 18:26:29

我正在尝试制作一个类似于Mvc的路由系统,在该系统中,用户创建类/控制器,HTTP请求被路由到它们。我把所有的基础知识都记下来了,它在很大程度上是通过使用反射来工作的。

当我尝试IoC/Dependency Injection/Service Resolver时,就会出现问题。我希望人们能够创建一个注入服务的控制器(就像mvc一样),只需在构造函数中声明他们需要什么,并将它们添加到IoC容器中。我能够传递/使用System.IServiceProvider来调用我需要的控制器类型上的GetService(Type)。但是,除非我专门将控制器类型添加到IoC容器中,否则这是不起作用的。不需要在Mvc中为IoC注册控制器,所以我相信有一个解决方法。

我尝试过使用反射从运行的程序集/appdomain中查找所有"ControllerBase"子类,并在启动时将它们添加到IServiceProvider/IServiceCollection?但是,向ASP.NET 5/Dnx core 5的迁移似乎改变了应用程序域和程序集的工作方式或访问方式。任何关于如何在用户不必注册每个控制器的情况下自动实现这一点的指导都是很好的。此外,任何关于mvc如何做到这一点的信息都将非常好。

解析ASP.NET 5的动态IoC控制器

使用依赖项注入创建对象实例的代码:

public void ConfigureServices(IServiceCollection services)
{
    HomeController controller;
    var controllerFactory = Microsoft.Extensions.DependencyInjection.ActivatorUtilities.CreateFactory(typeof(HomeController), Type.EmptyTypes);
    controller = (HomeController)controllerFactory(services.BuildServiceProvider(), null);
}

要创建MVC类型,请使用实例DefaultTypeActivatorCache。它使用静态对象ActivatorUtilities。