Ninject Owin请求范围无声失败

时间:2015-05-04 20:22:58

标签: dependency-injection ninject owin

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

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

2 个答案:

答案 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)。