2014-10-11 112 views
3

我正在構建一個ASP.NET MVC5 web應用程序,使用Ninject.MVC5的DI。我試圖將NinjectWebCommon類移入單獨的類庫項目。我可以通過使用下面的代碼成功地做到這一點:錯誤加載模塊'Ninject.Web.Mvc.MvcModule'類型MvcModule

private static IKernel CreateKernel() 
{ 
    var kernel = new StandardKernel(); 
    try 
    { 
     // Uncomment to move this file to a separate DLL 
     kernel.Load("MyWebApp.dll"); 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

     RegisterServices(kernel); 
     return kernel; 
    } 
    catch 
    { 
     kernel.Dispose(); 
     throw; 
    } 
} 

在上面的代碼,MyWebApp.dll是主要的Web應用程序組件的文件名。這工作,但需要我硬編碼的Web應用程序DLL的引用。我的官方文檔中閱讀下列可能可以用來自動加載所有的DLL中已經以這種方式被分離的解決方案:

kernel.Load(AppDomain.CurrentDomain.GetAssemblies()); 

但是,如果我用這個代碼,而不是硬的編碼的參考,我收到下面的異常(捕獲,並在上面的throw線重新拋出):

An exception of type 'System.NotSupportedException' occurred in 
MyWebApp.Infrastructure.dll and wasn't handled before a managed/native boundary 

Additional information: Error loading module 'Ninject.Web.Mvc.MvcModule' of 
type MvcModule 

任何人都可以提供關於正在發生的事情在這裏,如何防止這種異常的同時避免硬編碼存在的一些信息引用其他程序集?

+0

'AppDomain.CurrentDomain'中只包含已經加載到域組件 - 在一般的情況下,這不是\ bin文件夾中的所有DLL。如果你可以引用'MyWebApp.dll',那麼你可以使用'typeof(SomeClassInsideMyWebApp).Assembly'。 – Lanorkin 2014-10-12 10:34:44

回答

3

當您創建內核時,您需要確保將設置LoadExtensions設置爲false

根據文檔:

LoadExtensions:獲取或設置指示是否內核 應在啓動時自動加載的擴展的值。

以下行:

var kernel = new StandardKernel(); 

...應該成爲這樣的:

var kernel = new StandardKernel(new NinjectSettings() { LoadExtensions = false }); 
+1

這對我有效,但爲什麼這個工作,你什麼時候將這個屬性設置爲'true'? – 2016-12-13 13:39:55

+0

是的..爲什麼會是一個非常好的補充! – bradgonesurfing 2017-10-16 12:55:39