我的公司有一个部署策略(我跳过详细信息),以便任何第三方软件都应安装在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 dll在GAC中,它会正确加载模块,但是在实例化MVC Controller时,不会注入依赖项(在某些情况下为null,在某些情况下MVC会返回错误“No parameterless constructor etc etc.”) 。如果我在Web / bin文件夹中手动复制Ninject * .dll,那么一切正常,即使没有重新启动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
}
有谁能告诉我原因?可能是一个解决方案? :-)非常感谢!!
答案 0 :(得分:0)
Ninject有一个内置的扩展加载机制,用于加载Ninject.Web.Mvc
之类的不同扩展。
但是机制只关注应用程序文件夹加载扩展名,所以如果你的dll在GAC中,Ninject将无法找到它们。
要解决此问题,您可以在创建MvcModule
时手动关闭自动扩展加载并加载StandardKernel
模块:
var _kernel = new StandardKernel(
new NinjectSettings() { LoadExtensions = false },
new MvcModule(),
/* your other modules * /);