Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# get访问器内部的异步调用-这是一种好的做法吗?_C#_Database_Silverlight_Asynchronous_Properties - Fatal编程技术网

C# get访问器内部的异步调用-这是一种好的做法吗?

C# get访问器内部的异步调用-这是一种好的做法吗?,c#,database,silverlight,asynchronous,properties,C#,Database,Silverlight,Asynchronous,Properties,我有一个显示客户信息的窗口。 当窗口加载时,我从构造函数调用LoadCustomer()方法,该方法从数据库异步加载客户信息,设置CurrentCustomer属性。 然后更新UI,因为它绑定到CurrentCustomer private void LoadCustomer(Guid customerID) { var customerContext = new CustomerContext(); var customerQuery = customerC

我有一个显示客户信息的窗口。 当窗口加载时,我从构造函数调用
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访问器中是一种好做法吗?

通常情况下,不是这样。

通常,如果获得某样东西还需要做一些其他昂贵的事情,那么您应该使用完整的getter方法来实现此目的:

public object GetSomething() { }

// accessing code
var value = obj.GetSomething();
这意味着获得某些东西不是免费的。。。与之相比:

var value = obj.Something;
这看起来更像是一个普通的值分配,隐藏了在幕后进行的危险的异步调用,IMO认为这是个坏主意

但与其他一切一样。。。它还取决于整个体系结构中的其他部分。

如果对象的全部目的是使用属性(例如Linq2Sql或实体框架实体)抽象出大量异步调用,那么这很好,因为您必须意识到您正在处理的调用与代码上下文无关(或接近无关)


这取决于代码的上下文。如果你每次访问这个酒店,你肯定会想起这个昂贵的电话,那么我认为这很好。但如果不是这样,那么您应该通过将其转换为一个完整的方法而不是属性来使其更显式。

他认为它在访问器中是延迟加载的,这是正确的,因为在创建对象时不会进行异步调用。只有在调用访问器时才会执行此操作

他还预计不会将其留在属性访问器中,而是在其他地方对其进行重构。当调用已经在访问器中隔离时,重构更容易


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

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

加载不属于getter。阅读该代码时不会产生副作用。更可能的情况是上下文会被移动,因此最好保持所有内容的可读性。有时,年长只是意味着年老。:)