C# 传递Ninject Web.Common UseNinject中间件返回内核实例的lambda可以吗?
为什么C# 传递Ninject Web.Common UseNinject中间件返回内核实例的lambda可以吗?,c#,ninject,owin,ioc-container,ninject.web,C#,Ninject,Owin,Ioc Container,Ninject.web,为什么使用InjectMiddleware使用lambda而不是容器实例 这样可以吗 var container = CreateKernel(); app.UseNinjectMiddleware(() => container); 与此相反: app.UseNinjectMiddleware(() => CreateKernel); 第一个代码段中的My container实例用于解析应用程序另一部分中的依赖项。Ninject中间件是否需要能够创建自己的实例,可以随意修改、修
使用InjectMiddleware
使用lambda而不是容器实例
这样可以吗
var container = CreateKernel();
app.UseNinjectMiddleware(() => container);
与此相反:
app.UseNinjectMiddleware(() => CreateKernel);
第一个代码段中的My container实例用于解析应用程序另一部分中的依赖项。Ninject中间件是否需要能够创建自己的实例,可以随意修改、修改和重新创建?如果没有,我希望避免多次构建依赖关系树,因此我想知道lambda是否可以只返回实例。有几点需要注意: 组件将在调用传入的
Func
后加载任何已定义的NinjectModule
,因此您需要注意不要两次加载任何内容
组件在IKernel
上调用Dispose
,因此您需要确保在启动关机后不会尝试访问该实例
您几乎可以在创建底层内核后立即访问它,也许您更愿意提交PR以使其可用 当前
OwinAppBuilderExtensions
定义
public const string NinjectOwinBootstrapperKey = "NinjectOwinBootstrapper";
它用来存储的运行时实例
OwinBootstrapper
持有对组件运行时实例的私有引用,Bootstrapper
实例依次公开对IKernel
public IKernel Kernel
{
get { return kernelInstance; }
}
所以有点公共关系
public IKernel Kernel
{
get
{
this.bootstrapper.Kernel;
}
}
调用
app.useinjectmiddleware(()=>container)后,toOwinBootstrapper
可以通过app.Properties
使底层的IKernel
可供您的代码使用代码>当我这样做时,ninject不会启动,也许它超出了范围?
public IKernel Kernel
{
get
{
this.bootstrapper.Kernel;
}
}