2013-05-15 78 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()方法。