问题 - Ninject内核总是返回新实例,即使它们是作用于请求的范围。
- 我正在使用OWIN和SystemWeb主机包来允许我使用IIS。
- 项目依赖于安装了所有必需的Ninject / owin库的API应用程序。
app.UseNinjectMiddleware(CreateKernel).UseNinjectWebApi(config);
- 在转换为OWIN之前,一切都按预期工作。
- 只创建一个内核实例。
- 注册了一些全局过滤器,它们在请求范围对象上设置某些属性。
public override void OnActionExecuting(HttpActionContext actionContext)
{
var accountService = Startup.Kernel.Get<IAccountService>();
// some changes to accountService etc.
- 当其他过滤管道然后尝试获取IAccountService
的实例时,它们总是返回一个新实例。
根据我自己的研究工作,这似乎是一个已知的问题。任何想法,将不胜感激。谢谢。
我见过类似的问题,也许这就是你的情况。
如果符合以下条件,InRequestScope
不起作用:
带有OWIN的Web API在单独的程序集中。该程序集具有Ninject和Web API以及OWIN安装它。
空的ASP.Net Web项目,它只引用了以前的程序集。 ASP.Net Web项目没有安装Web API或Ninject,它只包含允许OWIN托管在ASP.Net之上的软件包。
在那个设置中,Ninject似乎工作得很好;除了忽略InRequestScope并始终解析对象的不同实例。
问题是VS不会将所有必需的程序集复制到结果目录,因为它们不是由应用程序直接引用,而是由OWIN程序集使用,而只是由Ninject动态加载。
要解决这个问题,只需在您的ASP.Net Web项目中使用NuGet Ninject.Extensions.ContextPreservation。
也许这只是你的问题或它是相似的。看看Ninject Extensions并尝试识别您需要的扩展名未添加到结果目录中。
只是为了补充答案;你可能会发现另外(对于'IDisosable'对象)'Dispose()'没有被调用,绑定的去激活处理程序( - 如果存在 - )也不会被调用(但激活处理程序仍然会被调用),例如:
Bind<IThingSvc>().To<ThingSvc>()
.InRequestScope()
.OnActivation((ctx, x) => Debug.WriteLine($"Ninject:Activation - '{x.GetType()}' (- '{ctx.GetScope()?.GetType()}')"))
.OnDeactivation((ctx, x) => Debug.WriteLine($"Ninject:Deactivation - '{x.GetType()}' (- '{ctx.GetScope()?.GetType()}')"));
看起来'Ninject.Extensions.ContextPreservation'被'NamedScope'扩展名引用 - 'NamedScopeExtensionMethods.cs:IsCurrentResolveRoot()'。
您可能会发现所有OWIN-Host覆盖都没有工作/加载 - 例如未加载“OwinWebApiModule”模块(如果查询内核),甚至可能出现如下错误消息( - 引用OWIN命名范围 - 'Ninject_WebApiScope'/“内部常量字符串WebApiScopeName =”Ninject_WebApiScope“;”) :
[16:29:10]异常:E0434F4D.Ninject.Extensions.NamedScope.UnknownScopeException(“激活ApplicationUserManager时出错”当前上下文中未知范围Ninject_WebApiScope。没有匹配的范围可用,并且类型声明为InNamedScope(Ninject_WebApiScope)。