内部异步调用get accessor - 这是一个好习惯吗?

Yeo*_*nho 7 c# database silverlight asynchronous properties

我有一个显示客户信息的窗口.当窗口加载时,我LoadCustomer()从构造函数调用方法,该构造函数异步加载来自数据库的客户信息,这将设置CurrentCustomer属性.然后更新UI,因为它绑定到CurrentCustomer.

private void LoadCustomer(Guid customerID)
{           
   var customerContext = new CustomerContext();

   var customerQuery = customerContext.GetCustomersQuery()
                                         .Where(e => e.CustomerID == customerID);

   customerContext.Load(customerQuery, 
      loadOperation =>
      {
         CurrentCustomer = loadOperation.Entities.SingleOrDefault();
      }, null);
}
Run Code Online (Sandbox Code Playgroud)

高级程序员告诉我,最好把这个逻辑放在CurrentCustomer的get访问器中,因为那时候

  • 对数据库的调用将使用延迟加载,和
  • 重构会更容易.

将异步数据库调用放在属性的get访问器中是一种好习惯吗?

Ant*_*nes 5

听起来你的高级开发人员已经错过了代码的异步性质.将代码移动到属性的getter的唯一方法是阻塞调用线程,直到异步操作完成并且有一个值要返回.这将是非常糟糕的财产.


cha*_*rit 4

一般来说,事实并非如此。

通常,如果获取某些东西还涉及做其他昂贵的事情,那么您应该为此目的使用完整的 getter 方法:

public object GetSomething() { }

// accessing code
var value = obj.GetSomething();
Run Code Online (Sandbox Code Playgroud)

这意味着获得某些东西不是免费的......比较:

var value = obj.Something;
Run Code Online (Sandbox Code Playgroud)

这看起来更像是一个正常的值分配,隐藏了幕后发生的危险异步调用,在我看来这是一个坏主意。

但与其他一切一样......也取决于整个架构中的其他部分。

如果对象的整个目的是使用属性抽象出大量异步调用(例如 Linq2Sql 或实体框架实体的情况),那么这很好,因为您必须意识到您正在处理不(或关闭)的调用。 to) 不受代码上下文的影响。

...

这取决于代码的上下文。如果每当您访问此属性时,您确定会被提醒昂贵的电话,那么我认为这很好。但如果情况并非如此,那么您应该通过将其转变为成熟的方法而不是属性来使其更加明确。