2015-12-10 3 views
2

Я пытаюсь создать систему маршрутизации, похожую на Mvc, в которой пользователи создают классы/контроллеры и HTTP-запросы. У меня есть все основы, и это работает по большей части, используя отражение.Решение динамического контроллера IoC ASP.NET 5

Проблема возникает, когда я пытаюсь использовать IoC/Dependency Injection/Service Resolver. Я хочу, чтобы люди могли создавать контроллер, который вводит службы (как и mvc), просто объявляя, что им нужно в конструкторе, и добавляя их в контейнер IoC. Я могу передать/использовать System.IServiceProvider для вызова GetService (Type) для типа контроллера, который мне нужен. Это не работает, хотя я специально не добавляю типы контроллеров в контейнер IoC. Не нужно регистрировать контроллер в Mvc для IoC, поэтому я уверен, что есть обходной путь.

Я попытался использовать отражение, чтобы найти все дочерние классы ControllerBase из запущенной сборки/appdomain и при запуске добавить их в IServiceProvider/IServiceCollection? Но кажется, что переход на ASP.NET 5/Dnx ядро ​​5, похоже, изменил работу приложений или сборок приложений. Любое руководство о том, как выполнить это автоматически без необходимости регистрации каждого контроллера, было бы замечательным. Также любая информация о том, как mvc делает это, также будет отличной.

ответ

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.

+0

Вы спасаете мой день! –

Смежные вопросы