2010-10-04 50 views
7

我有一個顯示客戶信息的窗口。 當窗口加載時,我從構造函數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 accessor中放置異步數據庫調用是否是一種好的做法?

+0

負載不屬於* getter *。閱讀代碼不會產生副作用。這種情況很可能會被移動,所以最好保持一切可讀性。有時候*高級*意味着*舊*。 :) – 2010-10-04 08:27:59

回答

4

通常,它不是。

通常,如果得到的東西會涉及到做別的事情昂貴的爲好,你應該使用一個完整的getter方法只是爲了這個目的:

public object GetSomething() { } 

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

這意味着,獲得的東西是不是免費的?對比:

var value = obj.Something; 

這看起來更像是一個正常的賦值隱藏危險的異步調用去上,IMO是一個壞主意在幕後。

但是和其他所有零件一樣...... 它也取決於整個結構中其他零件上的

如果對象的整個目的是使用屬性(比如Linq2Sql或實體框架實體的情況)抽象掉很多異步調用,那麼這很好,因爲你必須知道你正在處理調用不是(或接近)不受代碼的影響。

...

它取決於代碼的上下文。如果你每次訪問這個屬性,你肯定會提醒你昂貴的電話,然後我認爲它是好的。但是,如果情況並非如此,那麼你應該把它變成一個完整的方法而不是一個屬性來更加明確。

1

他對訪問器中的惰性加載是正確的 - 因爲不會對對象創建進行異步調用。只有在訪問者被調用時纔會發生。

他也希望不要把它留在屬性訪問器中,而是在其他地方重構它。當呼叫已經被隔離在訪問器中時,重構更容易。

但是,將異步調用留在訪問器中並不是一個好主意,但聽起來並不像他期望它停留在那裏。

5

這聽起來像是你的高級開發者已經錯過了異步代碼的性質。將代碼移動到屬性的getter的唯一方法是阻止調用線程,直到異步操作完成並且存在要返回的值。這將是非常糟糕的表現。

相關問題