为什么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
可用于您的代码。