为什么Ninject dll应该在Web / bin文件夹中?我不能把它们放在GAC中吗?

时间:2014-01-02 16:59:37

标签: asp.net-mvc dll ninject gac ninject.web.mvc

我的公司有一个部署策略(我跳过详细信息),以便任何第三方软件都应安装在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
}

有谁能告诉我原因?可能是一个解决方案? :-)非常感谢!!

1 个答案:

答案 0 :(得分:0)

Ninject有一个内置的扩展加载机制,用于加载Ninject.Web.Mvc之类的不同扩展。

但是机制只关注应用程序文件夹加载扩展名,所以如果你的dll在GAC中,Ninject将无法找到它们。

要解决此问题,您可以在创建MvcModule时手动关闭自动扩展加载并加载StandardKernel模块:

var _kernel = new StandardKernel( 
    new NinjectSettings() { LoadExtensions = false }, 
    new MvcModule(),
    /* your other modules * /);