如何使用Lazy当创建对象需要额外的上下文时
本文关键字:上下文 创建对象 Lazy 何使用 | 更新日期: 2023-09-27 18:05:43
Lazy<T>
和Lazy<T, TMetadata>
都不接受Func<TSomething, T>
。这似乎使得当创建逻辑需要一些额外的上下文时,不可能惰性地创建对象。
这是一个我想要达到的目标的编造的例子:
private readonly Lazy<IDbConnection, IStatement> insertStatement =
new Lazy<IDbConnection, IStatement>(
conn => conn.CreateStatement(...));
public void Apply(IDbConnection connection)
{
this.insertStatement.GetValue(connection).Execute(...);
}
在这里,需要一个IDbConnection
实例来创建Lazy
实例所容纳的IStatement
。这里的假设是,一旦IDbConnection
被"知道",它将保持不变。换句话说,IStatement
不需要随着时间的推移而改变,因为IDbConnection
不会。
我考虑了另一种选择,即我的类在其构造函数中接受IDbConnection
的实例,并使用该参数的闭包创建Lazy
实例。然而,实际情况是,获得连接是一个异步操作,我不知道如何在依赖对象需要它之前实现它。这是我想研究的一个问题,但我仍然想知道这个问题的答案……
是否有什么可以促进Lazy
使用的工厂可以传递一些上下文来帮助它创建对象实例的场景?
我不能评论,所以,为了帮助你,我需要把我的评论像一个答案一样发布。
如果我理解正确的话,您希望使用单例连接创建单个语句。如果我的想法是正确的,也许下面的代码可以帮助你:
new Lazy<IStatement>(() => ConnectionSingleton.Instance.CreateStatement());
如您所见,您可以将语句