什么是Ninject注入Lazy <t>对象时调用的Lazy <t>构造函数?</t> </t>

时间:2015-02-13 03:20:25

标签: c# ninject lazy-loading

Lazy有几个构造函数,通过它们可以控制Lazy实例的线程行为。 Ninject使用什么构造函数来创建注入的Lazy实例?我如何指定Ninject必须使用哪个构造函数?如果可能的话。

1 个答案:

答案 0 :(得分:5)

短篇小说

默认为LazyThreadSafetyMode.ExecutionAndPublication 使用以下方法之一进行更改:

 // for all Lazy's
 Bind<LazyThreadSafetyMode>().ToConstant(LazyThreadSafetyModeNone);

 // for a specific Lazy<FooBar>
 Bind<LazyThreadSafetyMode>().ToConstant(LazyThreadSafetyModeNone)
     .WhenInjectedInto(typeof(Lazy<FooBar));

或者您也可以使用Bind(typeof(Lazy<>))Bind<Lazy<FooBar>>()的绑定与

结合使用

长篇故事

Ninject.Extensions.Factory隐式提供了

Lazy<T>支持。

默认情况下,ninject将通过实例化该类型来解析对可以直接构造的类型(非接口,非抽象)的请求。这也适用于Lazy。然后,它将搜索具有最多参数的构造函数,并将其提供并使用该参数(请参阅herehere) Ninject.Extensions.Factory为Func提供绑定(参见here]。但它没有为LazyThreadSafetyMode提供绑定。因此Ninject将选择构造函数Lazy(Func<T>)。此构造函数使用LazyThreadSafetyMode.ExecutionAndPublication(请参阅备注here)。