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

2024-05-08

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

我有一个继承自 Microsoft.Web.ImageHandler 类的 HTTPHandler。

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

因为我无法从 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;
    }

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

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

var service = global.Kernel.Get<PhotoService>();

失败并出现以下情况...

   [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

UPDATE:我设法通过将 Global.Kernel 属性修改为此来解决此问题,但现在我进入了反模式领域 http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx...

public IKernel Kernel
    {
        get { return this.CreateKernel(); }
    }

现在将阅读并了解这意味着什么..


这是使用服务定位器反模式 http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx。它会起作用,但你会失去 IoC 的灵活性,并在各处添加难以测试的依赖项。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用现有的自定义库从 HttpHandler 访问 Ninject Kernel.Get() 的相关文章

随机推荐