在工厂类中,恒定服务用于从微服务获取数据。我想要该服务的延迟初始化。我发现了两种解决方法,两种方法都有效。
使用Func
public class ClientFactory: IClientFactory
{
private readonly Func<IConstantService> _constants;
public ClientFactory(Func<IConstantService> constants)
{
_constants = constants;
}
public Client GetClient()
{
return new Client(_constants().Uri);
}
}
使用懒惰
public class ClientFactory: IClientFactory
{
private readonly Lazy<IConstantService> _constants;
public ClientFactory(Lazy<IConstantService> constants)
{
_constants = constants;
}
public Client GetClient()
{
return new Client(_constants.Value.Uri);
}
}
有什么区别?
答案 0 :(得分:4)
Func
和Lazy
之间的基本区别在于,Func
用于创建事物(即0+),而{ {1}}用于创建事物(单数或0-1)。
每次调用Lazy
时,都有可能获得一个新值(“可能”是因为取决于Func
的作用-它可能返回相同的值,也可能不会相同) )。
Func
(默认情况下)将重复给您相同的值。即使多个线程要求提供Lazy
的值,它们也会(默认情况下)全部获得相同的对象。 Lazy
也(默认情况下)遭受exception caching的困扰,而Lazy
却没有。
如果您希望Func
无异常缓存,那么可能会感兴趣LazyWithNoExceptionCaching
。这就是我每天使用的。
例如,在单例内部是使用Lazy
而不是Func
的常见位置。这样,单例可以Lazy
根据需要建立另一个类型的多个实例。如果它使用new
,它将只有一个其他类型的实例。
上面,我一直在说默认情况下。这是因为Lazy
有different modes。我的评论都是关于Lazy
(默认行为)的。