我正在尝试制作一个类似Mvc的路由系统,用户在其中创建类/控制器,HTTP请求被路由到他们。我有所有的基本知识,它在很大程度上是通过使用反射来工作的。
当我尝试IoC/依赖项注入/服务解决程序时,问题就会发生。我希望人们能够通过在构造函数中声明他们需要的内容并将它们添加到IoC容器中来创建一个注入服务的控制器(就像mvc一样)。我能够传递/使用System.IServiceProvider调用我需要的控制器类型上的GetService(类型)。但是,除非我特别将控制器类型添加到IoC容器中,否则这是行不通的。我们不需要在Mvc中为IoC注册控制器,所以我确信有一个解决办法。
我尝试过使用反射来查找正在运行的程序集/应用程序域中的所有'ControllerBase‘子类,并在启动时将它们添加到IServiceProvider/IServiceCollection中?但是,迁移到ASP.NET 5/Dnx核心5似乎改变了应用程序域和程序集的工作方式或访问方式。任何指导如何自动完成这一点,而不需要用户注册每个控制器将是伟大的。另外,任何关于mvc如何做到这一点的信息也将是很棒的。
发布于 2015-12-10 14:49:58
使用依赖项注入创建对象实例的代码:
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。
https://stackoverflow.com/questions/34210451
复制