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

时间:2010-10-04 02:30:48

标签: 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);
}

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

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

将异步数据库调用放在属性的get访问器中是不错的做法?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

一般来说,不是。

通常如果得到的东西也会涉及做其他昂贵的事情,你应该为此目的使用一个完整的getter方法:

public object GetSomething() { }

// accessing code
var value = obj.GetSomething();

这表示获得某些东西不是免费的......比较:

var value = obj.Something;

这看起来更像是隐藏在场景后面发生的危险异步调用的正常值赋值,IMO是个坏主意。

但与其他所有内容一样...... 它也取决于整个架构中的其他部分。

如果对象的整个目的是使用属性抽象掉许多异步调用(例如Linq2Sql或Entity Framework实体的情况)那么这很好,因为你必须知道你正在处理不是(或接近)免于代码的上下文。

...

这取决于代码的上下文。如果您在访问此房产时,您确信会被提醒您这个昂贵的电话,那么我认为这很好。但如果情况并非如此,那么你应该通过把它变成一个完整的方法而不是属性来使它更明确。

答案 2 :(得分:1)

他在访问器中延迟加载是正确的 - 因为在创建对象时不会进行异步调用。只有在调用访问者时才会进行。

他也期待不将其留在物业存取器中,而是在别处重构。当访问者已经隔离了呼叫时,重构更容易。

然而,将异步调用留在访问器中并不是一个好主意,但听起来并不像他期望它留在那里。

相关问题