Проблемы с контроллерами MVC + внедрение зависимостей (Ninject) при среднем доверии - PullRequest
2 голосов
/ 28 марта 2009

Я хочу использовать внедрение зависимостей в среде среднего доверия. Для этой цели я выбрал 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'.

Если у контроллера нет контроллер фабрики, убедитесь, что он имеет открытый конструктор без параметров. "

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

Ответы [ 4 ]

2 голосов
/ 08 апреля 2009

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

2 голосов
/ 05 апреля 2009

Чтобы запустить 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). Эти удлинители предназначены для тяжелой работы.

1 голос
/ 28 марта 2009

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

UseReflectionBasedInjection = true;
0 голосов
/ 28 марта 2009

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

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;
    }

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

...