问题 - 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
的实例时,它们总是返回一个新实例。
根据我自己的研究工作,这似乎是一个已知的问题。任何想法,将不胜感激。感谢。
答案 0 :(得分:2)
我已经看到了类似的问题,也许这就是你的情况。
如果符合以下情况,则 InRequestScope
不起作用:
在单独程序集中使用OWIN的Web API 。该程序集具有Ninject和Web API,并且OWIN已将其安装在其中。
空的ASP.Net网络项目,其中仅引用上一个程序集。 ASP.Net Web项目没有安装Web API或Ninject,它只有允许OWIN托管在ASP.Net之上的软件包。
在那个设置中,Ninject似乎运行得很好;除了忽略InRequestScope并始终解析对象的不同实例。
问题是VS不会将所有必需的程序集复制到结果目录中,因为它们不是由应用程序直接引用,而是由OWIN程序集使用,而只是由Ninject动态加载。
要在ASP.Net网站项目中解决问题,只需NuGet Ninject.Extensions.ContextPreservation。
也许这只是你的问题或类似的问题。看看Ninject Extensions并尝试识别您需要的扩展程序未添加到结果目录中。
答案 1 :(得分:0)
只需添加答案即可;您可能会发现,除了(对于“ IDisosable”对象而言)“ Dispose()”没有被调用之外,绑定的停用处理程序(如果存在-)也不会被调用(但是激活处理程序仍然会),例如: / p>
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()}')"));
“ NamedScope”扩展名-“ NamedScopeExtensionMethods.cs:IsCurrentResolveRoot()”似乎引用了“ Ninject.Extensions.ContextPreservation”。
您可能会发现所有OWIN-Host替代都无法正常工作/加载-例如“ OwinWebApiModule”模块未加载(如果您查询内核),甚至可能出现如下错误消息(-引用OWIN named-scope-'Ninject_WebApiScope'/“内部常量字符串WebApiScopeName =” Ninject_WebApiScope“;”) :
[16:29:10]异常: E0434F4D.Ninject.Extensions.NamedScope.UnknownScopeException(“错误 激活ApplicationUserManager范围Ninject_WebApiScope不是 在当前情况下是已知的。没有匹配范围,并且 该类型声明为InNamedScope(Ninject_WebApiScope)。