2

我正在尝试将Bootstrapper 与 Ninject一起使用。我已经安装Ninject.MVC3了从 nuget 初始化我的 Ninject 容器,并且我创建了一个这样的测试模块:

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>();
    }
}

我也把Start()电话包括在我的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();
    }
}

但是,当调用具有依赖关系的控制器时,我仍然ActivationException从 Ninject 得到一个,表明我的TestNinjectModule.Load()方法没有被调用。我该如何解决?

异常消息:

激活 IUnitOfWork 时出错 没有匹配的绑定可用,并且类型不是自绑定的。激活路径:2)将依赖IUnitOfWork注入到类型>TreasurySystemController的构造函数的参数unitOfWork 1)对SystemController的请求

建议: 1) 确保您已为 IUnitOfWork 定义绑定。2) 如果绑定是在模块中定义的,请确保该模块已加载到 > 内核中。3) 确保您没有意外创建多个内核。4) 如果您使用构造函数参数,请确保参数名称与 >constructors 参数名称匹配。5) 如果您使用自动模块加载,请确保搜索路径和过滤器 > 正确。

堆栈跟踪:

在 c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs 中的 Ninject.KernelBase.Resolve(IRequest 请求):c:\Projects 中 Ninject.Planning.Targets.Target 1.GetValue(Type service, IContext parent) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 197 at Ninject.Planning.Targets.Target1.ResolveWithin(IContext parent) 的第 359 行\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs: 第 165 行 Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) 在 c:\Projects\Ninject\ninject\src\Ninject\ Activation\Providers\StandardProvider.cs:Ninject.Activation.Providers.StandardProvider 的第 114 行。<>c_DisplayClass4.b _2( ITarget目标)在 c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider。 cs:System.Linq.Enumerable.WhereSelectArrayIterator 2.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable)的第 96 行1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 来源)在 C:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs 中的 Ninject.Activation.Providers.StandardProvider.Create(IContext context):Ninject.Activation.Context.Resolve 的第 96 行( ) 在 c:\Projects\Ninject\ninject\src\Ninject\Activation\Context.cs:line 157 at Ninject.KernelBase.<>c_ DisplayClass10.b _c(IBinding binding) in c:\Projects\Ninject\ninject\src \Ninject\KernelBase.cs:System.Linq.Enumerable.WhereSelectEnumerableIterator 的第 386 行2.MoveNext() at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable1 来源)在 C:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectDependencyResolver.cs:line 56 中的 Ninject.Web.Mvc.NinjectDependencyResolver.GetService(Type serviceType)。 Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)

4

1 回答 1

3

我找到了解决方案。通过将实现更改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()

于 2013-05-20T04:16:41.057 回答