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

gsi*_*ank 0 c# lazy-loading ninject

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

Bat*_*nit 5

短篇故事

默认值是LazyThreadSafetyMode.ExecutionAndPublication 使用以下之一更改它:

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

 // for a specific Lazy<FooBar>
 Bind<LazyThreadSafetyMode>().ToConstant(LazyThreadSafetyModeNone)
     .WhenInjectedInto(typeof(Lazy<FooBar));
Run Code Online (Sandbox Code Playgroud)

或者您也可以使用Binding Bind(typeof(Lazy<>))Bind<Lazy<FooBar>>()结合使用

很长的故事

Lazy<T>Ninject.Extensions.Factory隐式提供了支持.

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