2

Я хочу использовать инъекцию зависимостей в среде среднего доверия. Для этого я выбрал Ninject, поскольку мне сказали, что он имеет небольшой вес. Как настроить впрыскивание в контроллеры?Проблемы с MVC-контроллерами + Инъекция зависимостей (Ninject) в среде доверия

Когда я попытался создать собственный контроллер завода:

public class NinjectControllerFactory : DefaultControllerFactory 
    { 
     private readonly IKernel _kernel; 
     public NinjectControllerFactory(params IModule[] modules) 
     { 
      _kernel = new StandardKernel(modules); 
     } 

     public override IController CreateController(System.Web.Routing.RequestContext requestContext, string controllerName) 
     { 
      IController controller = base.CreateController(requestContext, controllerName); 
      _kernel.Inject(controller); 
      return controller; 
     } 
    } 

Но я встретив эту ошибку:

System.InvalidOperationException was unhandled by user code 
    Message="An error occurred while creating a controller of type 'xxx'. 

If the controller doesn't have a controller factory, ensure that it has a parameterless public constructor."

Любая идея, как получить Ninject или любой другой рамки IoC, работающих под среде доверие (означает отсутствие использования отражения)

ответ

1

Попробуйте установить этот параметр при создании контейнера:

UseReflectionBasedInjection = true; 
0

Хороший наконечник (? Но вы имеете в виду установить его на ложь), я изменил свой конструктор так, что его так:

public NinjectControllerFactory(params IModule[] modules) 
     { 
      _kernel = new StandardKernel(modules); 
      _kernel.Options.UseReflectionBasedInjection = false; 
     } 

Это получает то же самое исключение, хотя.

Я также попытался перекрывая GetControllerInstance как это тоже

protected override IController GetControllerInstance(Type controllerType) 
    { 
     return _kernel.Get(controllerType) as IController; 
    } 

Но это бросает исключение безопасности, поскольку она использует отражение.

2

Для запуска Ninject 1.x в среднем режиме доверия вы должны установить UseReflectionBasedInjection вариант true. Ninject 2.0 не страдает от этого ограничения.

Отражение на самом деле не является защищенной операцией в среде доверия, но легкая генерация кода (которую Ninject использует по умолчанию для инъекций) - по крайней мере до .NET 3.5 SP1.

Как только вы переключитесь на инъекцию на основе отражения, ваш код должен работать по назначению. Я также рекомендую вам посмотреть Ninject.Framework.Mvc (для Ninject 1.x) или Ninject.Web.Mvc (для Ninject 2.0). Эти удлинители обрабатывают тяжелый подъем для вас.

+0

Я использовал ninject 2. Ninject.Web.Mvc не является средним доверием firendly – Dan

2

Мне никогда не удавалось решить эту проблему, в конце концов, я переключился на Unity - работает в условиях среднего доверия без каких-либо хлопот.

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