如何使用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使用的工厂可以传递一些上下文来帮助它创建对象实例的场景?

如何使用Lazy<T>当创建对象需要额外的上下文时

我不能评论,所以,为了帮助你,我需要把我的评论像一个答案一样发布。

如果我理解正确的话,您希望使用单例连接创建单个语句。如果我的想法是正确的,也许下面的代码可以帮助你:

new Lazy<IStatement>(() => ConnectionSingleton.Instance.CreateStatement());
如您所见,您可以将语句
的创建委托给其他类。