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



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

这样做可以吗?

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

取而代之的是:

app.UseNinjectMiddleware(() => CreateKernel);

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

有几点需要注意:

OwinBootstrapper组件将在调用传入的Func<IKernel>后加载任何已定义的NinjectModule,因此您需要注意不要加载任何内容两次。 看这里

Bootstrapper组件在IKernel上调用Dispose,因此您需要确保在启动关闭后不要尝试访问实例。 看这里


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

目前OwinAppBuilderExtensions定义

public const string NinjectOwinBootstrapperKey = "NinjectOwinBootstrapper";

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

app.Properties.Add(NinjectOwinBootstrapperKey, bootstrapper);

OwinBootstrapper保存对Bootstrapper组件的运行时实例的私有引用,而Bootstrapper实例又公开对IKernel的运行时实例的引用

public IKernel Kernel
{
    get { return kernelInstance; }
}

所以一点公关添加

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

OwinBootstrapper可以在调用 app.UseNinjectMiddleware(() => container); 后通过 app.Properties 使底层IKernel可用于您的代码。

相关内容

  • 没有找到相关文章

最新更新