Ninject Owin请求范围无声失败

问题描述 投票:3回答:2

问题 - 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的实例时,它们总是返回一个新实例。

根据我自己的研究工作,这似乎是一个已知的问题。任何想法,将不胜感激。谢谢。

dependency-injection ninject owin
2个回答
2
投票

我见过类似的问题,也许这就是你的情况。

如果符合以下条件,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并尝试识别您需要的扩展名未添加到结果目录中。


0
投票

只是为了补充答案;你可能会发现另外(对于'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)。

© www.soinside.com 2019 - 2024. All rights reserved.