Ninject Owin 请求范围静默失败

Ninject Owin Request Scope Silently Fails

问题 - Ninject 内核总是 returning 新实例,即使它们在请求范围内也是如此。

-我将 OWIN 与 SystemWeb 主机包一起使用以允许我使用 IIS。

-该项目依赖于一个 API 应用程序,该应用程序安装了所有必要的 Ninject/owin 库。

app.UseNinjectMiddleware(CreateKernel).UseNinjectWebApi(config);

-在转换为 OWIN 之前,一切都按预期工作。

-只创建了一个内核实例。

-注册了一些全局过滤器,这些过滤器在请求范围内的对象上设置某些属性。

        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var accountService = Startup.Kernel.Get<IAccountService>();
            // some changes to accountService etc.

-当其他过滤器在管道中尝试获取 IAccountService 的实例时,他们总是 return 一个新实例。

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

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

InRequestScope 在以下情况下不起作用:

Web API 在 单独的程序集 中使用 OWIN。该程序集有 Ninject 和 Web API 并且 OWIN 安装了它。

空 ASP.Net Web 项目,仅引用前一个程序集。 ASP.Net Web 项目没有安装 Web API 或 Ninject,它只有允许 OWIN 在 ASP.Net.

之上托管的包

在该设置中,Ninject 似乎工作正常;除了 InRequestScope 被忽略并且总是解析对象的不同实例。

问题在于 VS 不会将所有必需的程序集复制到结果目录,因为它们不被应用程序直接引用,也不被您的 OWIN 程序集使用,而只是由 Ninject 动态加载。

要解决此问题,只需在您的 ASP.Net 网络项目中使用 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 主机覆盖都不是 working/loaded - 例如"OwinWebApiModule" 模块未加载(如果您查询内核),甚至可能出现如下错误消息(- 指的是 OWIN 命名范围 - 'Ninject_WebApiScope'/"internal const string WebApiScopeName = "Ninject_WebApiScope";"):

[16:29:10] Exception: E0434F4D.Ninject.Extensions.NamedScope.UnknownScopeException ("Error activating ApplicationUserManager The scope Ninject_WebApiScope is not known in the current context. No matching scopes are available, and the type is declared InNamedScope(Ninject_WebApiScope).