c# - Bootstrapper 未加载我的 NinjectModules

标签 c# asp.net-mvc-4 dependency-injection ninject bootstrapper

我正在尝试使用Bootstrapper with 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>();
    }
}

我还在我的 Global.asax.cs 中包含了 Start() 调用

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

但是,当调用具有依赖项的 Controller 时,我仍然从 Ninject 收到 ActivationException ,表明未调用我的 TestNinjectModule.Load() 方法。我该如何解决这个问题?

异常消息:

Error activating IUnitOfWork No matching bindings are available, and the type is not self-bindable. Activation path: 2) Injection of dependency IUnitOfWork into parameter unitOfWork of constructor of type > TreasurySystemController 1) Request for SystemController

Suggestions: 1) Ensure that you have defined a binding for IUnitOfWork. 2) If the binding was defined in a module, ensure that the module has been loaded into > the kernel. 3) Ensure you have not accidentally created more than one kernel. 4) If you are using constructor arguments, ensure that the parameter name matches the >constructors parameter name. 5) If you are using automatic module loading, ensure the search path and filters are >correct.

堆栈跟踪:

at Ninject.KernelBase.Resolve(IRequest request) in c:\Projects\Ninject\ninject\src\Ninject\KernelBase.cs:line 359 at Ninject.Planning.Targets.Target1.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) in c:\Projects\Ninject\ninject\src\Ninject\Planning\Targets\Target.cs:line 165 at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 114 at Ninject.Activation.Providers.StandardProvider.<>c_DisplayClass4.b_2(ITarget target) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 at System.Linq.Enumerable.WhereSelectArrayIterator2.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source) at Ninject.Activation.Providers.StandardProvider.Create(IContext context) in c:\Projects\Ninject\ninject\src\Ninject\Activation\Providers\StandardProvider.cs:line 96 at Ninject.Activation.Context.Resolve() in 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:line 386 at System.Linq.Enumerable.WhereSelectEnumerableIterator2.MoveNext() at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable1 source) at Ninject.Web.Mvc.NinjectDependencyResolver.GetService(Type serviceType) in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectDependencyResolver.cs:line 56 at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)

最佳答案

我已经找到解决办法了。通过将 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() 方法。

关于c# - Bootstrapper 未加载我的 NinjectModules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16559752/

相关文章:

c# - 在单个 exe 中捆绑 .net exe、dll、.net 环境和 native dll

c# - Metro 风格应用程序中的自定义类属性

jquery - 如何手动关闭 Kendoui 弹出窗口

asp.net - 流式上传时获取上传文件的名称

php - 在 Laravel 5 中实例化依赖关系,好方法

c# - 中间件使用从客户端发送的参数,并根据这些参数允许或不允许与端点交互

c# - 使用 Process.Start 修复 CA2122

c# - 将 WebSecurity 与 .Net winForms 应用程序一起使用

Java/Jersey - 使用 ParamInjectionResolver 创建自己的注入(inject)解析器 - 奇怪的行为

java - 如何在 E4 应用程序中注入(inject)自定义单例 bean?