У моей компании есть политика развертывания (я пропускаю подробности), согласно которой любое стороннее программное обеспечение должно быть установлено в 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
}
Кто-нибудь может предложить мне причину, почему? А возможно решение? :-) Большое спасибо!!
var _kernel = new StandardKernel( new NinjectSettings() { LoadExtensions = false }, new MvcModule(), /* your other modules * /);
- person nemesv   schedule 03.01.2014