我有一个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
更新 我设法通过将Global.Kernel属性修改为此来修复此问题,但现在进入anti pattern territory ...
public IKernel Kernel
{
get { return this.CreateKernel(); }
}
现在请阅读,看看这意味着什么......
答案 0 :(得分:6)
这是使用Service-Locator anti-pattern。它会起作用,但是你会失去IoC的灵活性,并在任何难以测试的地方添加一个依赖。
这个简单的答案是你可以在你的HttpHandler中添加“KernelContainer.Inject(this)”。或者您可以创建一个自定义模块(或修改现有的Ninject.Web)以在处理程序执行之前执行注入。