gsi*_*ank 0 c# lazy-loading ninject
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));
Run Code Online (Sandbox Code Playgroud)
或者您也可以使用Binding Bind(typeof(Lazy<>))
或Bind<Lazy<FooBar>>()
结合使用
Lazy<T>
Ninject.Extensions.Factory隐式提供了支持.
默认情况下,ninject将通过实例化该类型来解析对可以直接构造的类型(非接口,非抽象)的请求.这也适用Lazy
.然后它将搜索具有它可以提供的最多参数的构造函数并使用它(参见此处和此处)Ninject.Extensions.Factory为Func
s 提供绑定(参见此处).但它不提供绑定LazyThreadSafetyMode
.Ninject因此将选择构造函数Lazy(Func<T>)
.这个构造函数使用LazyThreadSafetyMode.ExecutionAndPublication
(参见这里的备注).