我有一个 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(); }
}
现在将阅读并了解这意味着什么..