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)后,to
OwinBootstrapper
可以通过
app.Properties
使底层的
IKernel
可供您的代码使用

当我这样做时,ninject不会启动,也许它超出了范围?
public IKernel Kernel
{ 
    get
    {
        this.bootstrapper.Kernel;
    }
}