我们有一个非常基本的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();
});
有人知道如何实现这个吗?
答案 0 :(得分:1)
在查看NInject代码之后,在我看来NInject.Web.Common.OwinHost不应该在没有WebApi或者其他一些附加组件的情况下工作。
实际上,只有当某个组件实现INinjectHttpApplicationPlugin时,InScope才会起作用,如this code所示,此接口目前仅在特定扩展中实现,如MVC,WebApi或WCF。
所以我建议唯一的方法是实现自己的INinjectHttpApplicationPlugin。 this post和this answer中有一些想法可能为NInject的简单范围鉴别器提供构建块。
答案 1 :(得分:0)
好的,所以我想出来了......
当我将Ninject.Web和Ninject.Web.Common NuGet包添加到我的项目时,一切都按预期工作。
现在ik可以使用.InRequestScope(),并且每个请求都会创建一次(和共享)所有依赖项。此外,IDisposable的所有实现都已正确处理。它的工作方式与使用WebAPI或MVC时的工作方式相同。