2013-05-15 73 views
2

我試圖用Bootstrapper with Ninject。我已經安裝了Ninject.MVC3從的NuGet初始化我Ninject容器和我創建了一個測試模塊是這樣的:引導程序不加載我NinjectModules

public class TestNinjectModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<DBEntities>().ToSelf().InRequestScope(); 
     Bind(typeof(IGenericRepository<>)) 
       .To(typeof(GenericRepository<>)).InRequestScope(); 
     Bind<ISystemRepository>().To<SystemRepository>().InRequestScope(); 
     Bind<IUnitOfWork>().To<UnitOfWork>(); 
    } 
} 

我也包括在我Global.asax.cs

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 

     Bootstrapper.With.Ninject().Start(); 
     Bootstrapper.With.AutoMapper().Start(); 
    } 
} 

Start()呼叫不過,我仍然得到一個ActivationException當Ninject調用具有依賴關係的控制器時,表示我的TestNinjectModule.Load()方法未被調用。我該如何解決這個問題?

異常消息:

錯誤激活IUnitOfWork 沒有匹配的綁定是可用的,並且類型不是自可綁定。 激活路徑:依賴IUnitOfWork的 2)注射入型的構造的參數的UnitOfWork> TreasurySystemController 1)請求SystemController

建議: 1)確保已定義IUnitOfWork的結合。 2)如果綁定是在模塊中定義的,請確保該模塊已被加載到內核中。 3)確保你沒有意外創建多個內核。 4)如果您使用構造函數參數,請確保參數名稱與>構造函數參數名稱匹配。 5)如果您正在使用自動模塊加載,請確保搜索路徑和過濾器>正確。

堆棧跟蹤:

在Ninject.KernelBase.Resolve(IRequest請求)在C:\項目\ Ninject \ ninject \ SRC \ Ninject \ KernelBase.cs:線359 在Ninject.Planning 。目標1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197 at Ninject.Planning.Targets.Target 1.在C:\ Projects \ Ninject \ ninject \ src \ Ninject \ Planning \ Targets \ Target.cs中設置ResolveWithin(IContext父級):第165行 at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context ,ITarget靶)在C:\項目\ Ninject \ ninject \ SRC \ Ninject \激活\提供商\ StandardProvider.cs:線114 在Ninject.Activation.Providers.StandardProvide河<> C_ DisplayClass4.b _2(ITarget目標)在C:\項目\ Ninject \ ninject \ SRC \ Ninject \激活\提供商\ StandardProvider.cs:在System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() at System.Linq.Buffer 1線96 ..在Ninject的c:\ Projects \ Ninject \ ninject \ src \ Ninject \ Activation \ Providers \ StandardProvider.cs:96 處的Ninject.Activation.Providers.StandardProvider.Create(IContext上下文)中的ctor(IEnumerable 1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable 1源) 。 Activation.Context.Resolve(c)中:\項目\ Ninject \ ninject \ SRC \ Ninject \激活\ Context.cs:在Ninject.KernelBase線157 。 <> C_ DisplayClass10.b _c(IBinding結合)在C:\項目\ Ninject \ ninject \ SRC \ Ninject \ KernelBase.cs:在System.Linq.Enumerable.WhereSelectEnumerableIterator 2.MoveNext() at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable 1個源) 在Ninject線386 。 Web.Mvc.NinjectDependencyResolver.GetService(類型的serviceType)在C:\項目\ Ninject \ ninject.web.mvc \ MVC3 \ SRC \ ninject.Web.Mvc \ NinjectDependencyResolver.cs:線56 在System.Web.Mvc.DefaultControllerFactory .DefaultControllerActivator。創建(RequestContext requestContext,類型controllerType)

+0

'ActivationException''...'當一個具有依賴關係的控制器被調用'...什麼異常?什麼叫''?我認爲你可能會跳到不成熟的結論。如果你在'Load'上放置一個斷點,會發生什麼?當您在激活失敗時檢查內核時,您會看到什麼? –

+0

@RubenBartelink ActivionException是Ninject無法解析依賴關係時拋出的異常。當我在我的'Application_Start()'和'CreateKernel()'(在通過安裝'Ninject.MVC3' nuget包創建的'NinjectWebCommon'類中)中放置斷點時,會創建**兩個**內核,一個沒有我的綁定被激活來解決依賴關係。這就是爲什麼我得到例外 – rexcfnghk

+0

TL; DR - 你沒有回答我的問題,這就是爲什麼沒人回答你的問題。我知道ActivationException和其他許多人做了什麼。我的意思是一個完整的StackTrace(它不一定是20頁),而且Message增加了很多。 2個內核用於2個HttpApplications。你的Load()被擊中了嗎?在沒有綁定的情況下,對於內核發生的失敗決定[我們沒有堆棧跟蹤](當你告訴調試器斷開第一次機會時)。 –

回答

2

我找到了解決方案。通過改變NinjectWebCommon執行情況:

public static class NinjectWebCommon 
{ 
    private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 
    public static IKernel Kernel { get; private set; } // Expose the kernel through a property 

    /// <summary> 
    /// Starts the application 
    /// </summary> 
    public static void Start() 
    { 
     DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
     DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
     bootstrapper.Initialize(CreateKernel); 
    } 

    /// <summary> 
    /// Stops the application. 
    /// </summary> 
    public static void Stop() 
    { 
     bootstrapper.ShutDown(); 
    } 

    /// <summary> 
    /// Creates the kernel that will manage your application. 
    /// </summary> 
    /// <returns>The created kernel.</returns> 
    private static IKernel CreateKernel() 
    { 
     var kernel = new StandardKernel(); 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

     return Kernel = kernel; 
    } 
} 

然後在Global.asax.cs

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 

     Bootstrapper.With.AutoMapper().Start(); 
     Bootstrapper.With.Ninject() 
      .WithContainer(NinjectWebCommon.Kernel) // Use the kernel inside NinjectWebCommon instead of creating a new one 
      .Start(); 
    } 
} 

然後從NinjectModule派生的類將調用其Load()方法。