使用Ninject的C#,.NET和IoC:如何预热需要很长时间才能创建的类的实例?

时间:2012-10-24 05:16:32

标签: c# .net dependency-injection ninject

我的应用程序中有来自Ninject的IOC。有几个类需要花费大量时间来初始化(从DB或文件中获取一些静态数据缓存)。显然,他们需要在处理第一个用户请求之前创建它们。否则会有很高的超时风险。 Ninject是否提供了一种方法来告诉内核通过绑定并创建一些?

2 个答案:

答案 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);