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

What is the Lazy<T> constructor called when Ninject inject Lazy<T> objects?

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

短篇小说

默认为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>>() 的绑定与

结合使用

说来话长

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

默认情况下 ninject 将通过实例化该类型来解决对可以直接构造的类型(非接口、非抽象)的请求。 Lazy 也是如此。然后它将搜索它可以提供并使用最多参数的构造函数(参见 here and here) Ninject.Extensions.Factory 为 Func 提供绑定(参见 here]. But it does not provide a Binding for LazyThreadSafetyMode. Ninject will thus choose the constructor Lazy(Func<T>). This constructor uses LazyThreadSafetyMode.ExecutionAndPublication (see Remarks here)。