4

我有一个 .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

这是代码:

全球.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;
    }
}

网络配置

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

自定义HttpModule.cs

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

服务模块.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上的这篇文章,我不应该这样做。

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

4

1 回答 1

3

目前从 NinjectHttpApplication 派生时没有使用 NinjectHttpModule 的好方法。引导程序为两种方式注册 HttpApplicationInitializationHttpModule ,一旦加载了 NinjectHttpModule ,这个模块也会被加载。

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

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

于 2012-05-14T23:24:32.130 回答