2

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

这样做可以吗?

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

而不是这个:

app.UseNinjectMiddleware(() => CreateKernel);

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

4

1 回答 1

3

有几点需要注意:

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

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


您几乎可以在创建底层内核后立即访问它,也许您更愿意提出 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;
    }
}

toOwinBootstrapper可以IKernelapp.Properties调用app.UseNinjectMiddleware(() => container);.

于 2016-03-15T09:28:15.873 回答