Lazy有几个构造函数,通过它们可以控制Lazy实例的线程行为。 Ninject使用什么构造函数来创建注入的Lazy实例?我如何指定Ninject必须使用哪个构造函数?如果可能的话。
答案 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>>()
的绑定与
Lazy<T>
支持。
默认情况下,ninject将通过实例化该类型来解析对可以直接构造的类型(非接口,非抽象)的请求。这也适用于Lazy
。然后,它将搜索具有最多参数的构造函数,并将其提供并使用该参数(请参阅here和here)
Ninject.Extensions.Factory为Func
提供绑定(参见here]。但它没有为LazyThreadSafetyMode
提供绑定。因此Ninject将选择构造函数Lazy(Func<T>)
。此构造函数使用LazyThreadSafetyMode.ExecutionAndPublication
(请参阅备注here)。