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

时间:2015-07-30 23:37:04

标签: c# .net lazy-initialization base-class-library

var response = client.UploadString("http://my_actual_server_name:8080/SimpleService", data); 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实例所容纳的IStatement。这里的假设是,一旦Lazy被“知道”,它将保持不变。换句话说,IDbConnection不需要随时间变化,因为IStatement不会。

我已经考虑过替代方法,我的类在其构造函数中使用IDbConnection的实例,并使用该参数的闭包创建IDbConnection实例。但是,实际情况是获取连接是一个异步操作,我很难看到如何在我的依赖对象需要之前实现这一点。这是我打算追求的问题,但仍然想知道这个问题的答案......

是否有任何方法可以促进Lazy使用的工厂可以传递一些帮助它创建对象实例的上下文的场景?

1 个答案:

答案 0 :(得分:0)

我无法发表评论,所以,为了尝试帮助你,我需要像回答一样发表评论。

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

new Lazy<IStatement>(() => ConnectionSingleton.Instance.CreateStatement());

如您所见,您可以委托其他类创建Statement