gpt4 book ai didi

c# - 将返回内核实例的 lambda 传递给 Ninject Web.Common UseNinjectMiddleware 是否可以?

转载 作者:行者123 更新时间:2023-11-30 21:50:57 26 4
gpt4 key购买 nike

为什么 UseNinjectMiddleware 采用 lambda 而不是容器实例?

这样做可以吗?

var container = CreateKernel();
app.UseNinjectMiddleware(() => container);

而不是这个:

app.UseNinjectMiddleware(() => CreateKernel);

第一个片段中的容器实例用于解决我应用程序另一部分中的依赖项。 Ninject 中间件是否需要能够创建它自己的实例,它可以随意修改、混搭和重新创建?如果不是,我想避免多次构建依赖关系树,因此我想知道 lambda 是否可以只返回实例。

最佳答案

有几点需要注意:

OwinBootstrapper 组件将加载任何定义的 NinjectModule在调用传入的 Func<IKernel> 之后所以你需要注意不要加载任何东西两次。 see here

Bootstrapper 组件调用 DisposeIKernel因此您需要确保在启动关闭后不会尝试访问该实例。 see here


您几乎可以在创建底层内核后立即访问它,也许您更愿意提出 PR 以使其可用?

当前 OwinAppBuilderExtensions定义

public const string NinjectOwinBootstrapperKey = "NinjectOwinBootstrapper";

它用来存储 OwinBootstrapper 的运行时实例

app.Properties.Add(NinjectOwinBootstrapperKey, bootstrapper);

OwinBootstrapper持有对 Bootstrapper 的运行时实例的私有(private)引用组件和 Bootstrapper instance 依次公开对 IKernel 的运行时实例的引用

public IKernel Kernel
{
get { return kernelInstance; }
}

所以添加一点 PR

public IKernel Kernel
{
get
{
this.bootstrapper.Kernel;
}
}

OwinBootstrapper可以使基础IKernel通过 app.Properties 提供给您的代码在调用 app.UseNinjectMiddleware(() => container); 之后.

关于c# - 将返回内核实例的 lambda 传递给 Ninject Web.Common UseNinjectMiddleware 是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35997441/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com