如何使用NinjectHttpApplication(无nuget)在HttpModule中注入依赖项?

时间:2012-05-14 04:47:21

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

我有一个.Net MVC 3.0应用程序,我正在使用Ninject 3.0。我没有安装任何nuget。我正在引用Ninject.dll,Ninject.Web.Common.dll和Ninject.Web.Mvc.dll(以及其他2个)。我希望在自定义HttpModule中注入依赖项,我无法弄清楚如何使它与NinjectHttpApplication一起使用。

我有这个错误:

激活IntPtr时出错 没有匹配的绑定可用,并且该类型不可自我绑定 激活路径:
 3)将依赖IntPtr注入到Func {IKernel}类型的构造函数的参数方法中  2)将依赖关系Func {IKernel}注入到HttpApplicationInitializationHttpModule类型的构造函数的参数lazyKernel中  1)请求IHttpModule

以下是代码:

Global.asax中

public class MvcApplication: NinjectHttpApplication
{
    ...
    protected override void OnApplicationStarted()
    {
        base.OnApplicationStarted();

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }

    protected override IKernel CreateKernel()
    {
        var modules = new INinjectModule[]
        {
            new ServiceModule()
        };

        IKernel kernel = new StandardKernel(modules);

        return kernel;
    }
}

的Web.Config

<httpModules>
    <add name="NinjectHttpModule" type="Ninject.Web.Common.NinjectHttpModule"/>
</httpModules>

CustomHttpModule.cs

public class CustomHttpModule : IHttpModule
{
    private ITesttService service;
    public CustomHttpModule(ITesttService service)
    {
        this.service = service;
    }
    ...
}

ServiceModule.cs

public class ServiceModule : NinjectModule  
{
    public override void Load()
    {
        ...
        Kernel.Bind<ITestService>().To<TestService>();
        Kernel.Bind<IHttpModule>().To<CustomHttpModule>().InSingletonScope();
    }
}

此绑定解决了我的问题:

kernel.Bind<Func<IKernel>>().ToMethod(c => () => this.Kernel);

但根据github上的这个 post ,我不应该这样做。

你能告诉我我做错了什么或错过了吗?

1 个答案:

答案 0 :(得分:3)

目前,在从NinjectHttpApplication派生时,没有好的方法可以使用NinjectHttpModule。引导程序为两种方式注册HttpApplicationInitializationHttpModule,并且只要加载NinjectHttpModule,也会加载此模块。

不幸的是,没有什么好处可以卸载它。

我建议您使用WebActivator代替从NinjectHttpApplication派生。这是让它运行的唯一正确方法。您不必使用nuget以这种方式设置您的应用程序。您也可以手动添加相同的文件并手动引用所有必需的程序集。