我的应用程序中有来自Ninject的IOC。有几个类需要花费大量时间来初始化(从DB或文件中获取一些静态数据缓存)。显然,他们需要在处理第一个用户请求之前创建它们。否则会有很高的超时风险。 Ninject是否提供了一种方法来告诉内核通过绑定并创建一些?
答案 0 :(得分:6)
您可以创建这些实例,并在连接应用程序时为所有家属使用WithConstructorArgument传递它们。我必须承认,这很奇怪,但是会奏效。
var heavy = new HeavyDependency();
Bind<SomeInterface>().To<SomeClass>().WithConstructorArgument("HeavyDependency", heavy );
答案 1 :(得分:0)
您可以隐藏代理背后的依赖关系并将其加载到后台:
public class LazyHeavyDependency : IHeavyDependency
{
private readonly Lazy<IHeavyDependency> lazy;
public LazyHeavyDependency(Lazy<IHeavyDependency> lazy)
{
this.lazy = lazy;
}
void IHeavyDependency.DoWork()
{
this.lazy.Value.DoWork();
}
}
你可以像这样连线:
var lazyDependency = new Lazy<IHeavyDependency>(() =>
new RealHeavyDependency());
Bind<IHeavyDependency>()
.ToConstant(new LazyHeavyDependency(lazyDependency));
// Load value in a background thread.
Task.Factory.StartNew(() => lazy.Value);