我正在尝试创建一个类似于Mvc的路由系统,其中用户创建类/控制器并将HTTP请求路由到它们。我掌握了所有基础知识,并且大多数情况下都使用反射。
当我尝试使用IoC /依赖注入/服务解析器时会出现问题。我希望人们能够创建一个注入服务的控制器(就像mvc一样),只需在构造函数中声明它们需要的内容并将它们添加到IoC容器中。我能够传递/使用System.IServiceProvider来调用我需要的控制器类型上的GetService(Type)。除非我专门将控制器类型添加到IoC容器,否则这不起作用。我不需要在Mvc中为IoC注册一个控制器,所以我确信有一个解决方法。
我试过使用反射从运行的程序集/ appdomain中找到所有'ControllerBase'子类,并在启动时将这些子类添加到IServiceProvider / IServiceCollection中?但似乎转向ASP.NET 5 / Dnx核心5似乎改变了appdomains和程序集的工作方式或访问方式。如何在没有用户注册每个控制器的情况下自动完成此任务的任何方向都会很棒。还有关于mvc如何做到这一点的任何信息都会很棒。
答案 0 :(得分:5)
使用依赖注入创建对象实例的代码:
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。