Почему библиотеки Ninject должны находиться в папке Web / bin? Разве я не могу просто поместить их в GAC?

У моей компании есть политика развертывания (я пропускаю подробности), согласно которой любое стороннее программное обеспечение должно быть установлено в GAC, в то время как наши библиотеки находятся в папке Web / bin. Но этот подход не работает с Ninject и MVC 3/4. Возьмем пример:

Это мой код привязки зависимостей:

public class RequestorDependenciesRegistration : NinjectModule
{
  public override void Load()
  {
    Bind<IMyDearDependency>().To<MyDearImplementation>();
  }
}

А это мой контроллер MVC:

public MyController(IMyDearDependency something) {
  this.something = something; // 'something' is set only if Ninject dlls are in Web/bin... X-(
}

Если библиотеки Ninject находятся в GAC, он загружает модуль правильно, но при создании экземпляра контроллера MVC зависимость не вводится (в некоторых случаях имеет значение null, в некоторых случаях MVC возвращает ошибку «Нет конструктора без параметров и т. Д. И т. Д.»). Если я вручную скопирую Ninject * .dll в папку Web / bin, все будет работать нормально, даже без перезапуска IIS! Не могу понять, почему ...

Что еще более удивительно (для меня), если я сделаю что-то сверхъестественное, например, сохраню ссылку на экземпляр ядра Ninject в общедоступном статическом свойстве и использую его как ServiceLocator, это сработает! (Что-то вроде этого в контроллере MVC):

public MyController(IMyDearDependency something) { // 'something' is always null if Ninject is only in the GAC...
  var controller = Kernel.Get<MyController>()
  this.something = controller.something; // ... but this 'controller.something' is set, even if Ninject is only in the GAC!!! 8-O
}

Кто-нибудь может предложить мне причину, почему? А возможно решение? :-) Большое спасибо!!


person Mauretto    schedule 02.01.2014    source источник
comment
Вы можете попробовать отключить автоматическую загрузку расширений и вручную загрузить MvcModule: поэтому при создании ядра используйте следующие настройки: var _kernel = new StandardKernel( new NinjectSettings() { LoadExtensions = false }, new MvcModule(), /* your other modules * /);   -  person nemesv    schedule 03.01.2014
comment
: -O Сейчас работает !!! Я не могу в это поверить !! Не могли бы вы объяснить мне, почему?   -  person Mauretto    schedule 03.01.2014


Ответы (1)


Ninject имеет встроенный механизм загрузки расширений, который используется для загрузки различных расширений, таких как Ninject.Web.Mvc.

Но механизм ищет только папку приложения для загрузки расширений, поэтому, если ваша dll находится в GAC, Ninject их не найдет.

Чтобы решить эту проблему, вы можете отключить автоматическую загрузку расширений и загрузить модуль MvcModule вручную при создании своего StandardKernel:

var _kernel = new StandardKernel( 
    new NinjectSettings() { LoadExtensions = false }, 
    new MvcModule(),
    /* your other modules * /);
person nemesv    schedule 03.01.2014
comment
Большое спасибо! Это также решило проблему, с которой я столкнулся с Ninject.Extensions.Factory, я смог найти обходной путь, перезагрузив его явно, но теперь, когда все ясно, я вижу, что загружать его так: var kernel = new StandardKernel(new NinjectSettings() { LoadExtensions = false }, new MvcModule(), new FuncModule()); Еще раз спасибо! :-) - person Mauretto; 03.01.2014