使用现有的自定义基础从HttpHandler访问Ninject Kernel.Get()

Bal*_*ldy 2 webforms ninject httphandler

我有一个ASP.Net webforms应用程序,它使用Ninject 2.2.0.0

我有一个HTTPHandler,它继承自Microsoft.Web.ImageHandler类.

在其中我需要访问我创建的服务类的实例.

因为我不能从Ninject.Web.HttpHandlerBase继承我认为我只是将内核暴露为Global.asax类的属性...

protected override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel(new DefaultModule());

        var sms = kernel.Get<SiteMapService>();
        SiteMapSvc = sms;
        Kernel = kernel;
        return kernel;

    }

    public IKernel Kernel
    {
        get; set;
    }
Run Code Online (Sandbox Code Playgroud)

并使用kernel.Get方法获取服务..

var global = (Global) HttpContext.Current.ApplicationInstance;

var service = global.Kernel.Get<PhotoService>();
Run Code Online (Sandbox Code Playgroud)

这失败了以下......

   [ArgumentNullException: Cannot be null
Parameter name: root]
   Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root, Type service, Func`2 constraint, IEnumerable`1 parameters, Boolean isOptional, Boolean isUnique) in c:\Projects\Ninject\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:258
   Ninject.ResolutionExtensions.Get(IResolutionRoot root, Type service, IParameter[] parameters) in c:\Projects\Ninject\ninject\src\Ninject\Syntax\ResolutionExtensions.cs:151
   Thumb.GenerateImage(NameValueCollection parameters) in \Thumb.ashx.cs:40
Run Code Online (Sandbox Code Playgroud)

更新: 我设法通过修改Global.Kernel属性来解决这个问题,但现在我进入反模式领域 ......

public IKernel Kernel
    {
        get { return this.CreateKernel(); }
    }
Run Code Online (Sandbox Code Playgroud)

现在将阅读,看看这意味着什么..

Tal*_*joe 6

这是使用Service-Locator反模式.它会起作用,但是你会失去IoC的灵活性,并在任何难以测试的地方添加依赖.

这个简单的答案是你可以在你的HttpHandler中添加"KernelContainer.Inject(this)".或者您可以创建自定义模块(或修改现有的Ninject.Web)以在处理程序执行之前执行注入.