每个Owin语境的Ninject范围

时间:2016-01-11 10:49:44

标签: asp.net ninject owin ninject-extensions

我们有一个非常基本的Owin应用程序,我们希望使用Ninject来解决我们的依赖关系。我想指出,没有涉及Web API或MVC或其他中间件。

我们设置了这样的内核:

private static StandardKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Test>().ToSelf().InRequestScope();
        kernel.Load(Assembly.GetExecutingAssembly());
        return kernel;
    }

简化课程测试以更好地解释问题。

我们尝试设置Ninject并将内核注册为以下内容:

 app.UseNinjectMiddleware(CreateKernel);

我真的不知道这是否可行,但在文档等方面找不到类似内容。

我们想要的是在Owin请求的范围内解析单个Test实例。因此,我们假设我们有以下中间件:

 app.Use((context,next) =>
            {
               // How to access my Ninject Kernel or our test instance here?
                return next.Invoke();
            });


 app.Use((context,next) =>
                {
                   // How to access the same Ninject Kernel or our Test instance here?
                    return next.Invoke();
                });

有人知道如何实现这个吗?

2 个答案:

答案 0 :(得分:1)

在查看NInject代码之后,在我看来NInject.Web.Common.OwinHost不应该在没有WebApi或者其他一些附加组件的情况下工作。

实际上,只有当某个组件实现INinjectHttpApplicationPlugin时,InScope才会起作用,如this code所示,此接口目前仅在特定扩展中实现,如MVC,WebApi或WCF。

所以我建议唯一的方法是实现自己的INinjectHttpApplicationPlugin。 this postthis answer中有一些想法可能为NInject的简单范围鉴别器提供构建块。

答案 1 :(得分:0)

好的,所以我想出来了......

当我将Ninject.Web和Ninject.Web.Common NuGet包添加到我的项目时,一切都按预期工作。

现在ik可以使用.InRequestScope(),并且每个请求都会创建一次(和共享)所有依赖项。此外,IDisposable的所有实现都已正确处理。它的工作方式与使用WebAPI或MVC时的工作方式相同。