2013-11-20 72 views
0

我一直在關注MVVM模式上的Josh Smith的excellent article。在他的榜樣,他有一個CustomerRepository從源獲取數據:爲什麼庫類會調用靜態加載方法?

public CustomerRepository(string customerDataFile) 
{ 
    _customers = LoadCustomers(customerDataFile); 
} 

我不明白的是,他所謂的靜態方法,LoadCustomers,直接從他的構造函數的事實:

static List<Customer> LoadCustomers(string customerDataFile) 
{ 
    // In a real application, the data would come from an external source, 
    // but for this demo let's keep things simple and use a resource file. 
    using (Stream stream = GetResourceStream(customerDataFile)) 
    using (XmlReader xmlRdr = new XmlTextReader(stream)) 
     return 
      (from customerElem in XDocument.Load(xmlRdr).Element("customers").Elements("customer") 
      select Customer.CreateCustomer(
       (double)customerElem.Attribute("totalSales"), 
       (string)customerElem.Attribute("firstName"), 
       (string)customerElem.Attribute("lastName"), 
       (bool)customerElem.Attribute("isCompany"), 
       (string)customerElem.Attribute("email") 
       )).ToList(); 
} 

這是一種延遲加載模式,還是有開發人員會這樣做的其他特定原因嗎?

+0

對我來說似乎是加載測試數據。 –

+1

您很可能會通過依賴注入將您的資源庫注入ViewModel,並在適當的時間使用它來加載數據。就像邁克爾說的那樣,它看起來像一個簡單的方式來獲得一些數據的例子,並不一定反映生產代碼片段。一個倉庫通常是一個singleton(通過容器),因爲它可能是線程安全的,並且不需要多個實例,所以容器負責處理這個問題。靜態方法調用模仿這種類型的設置,而不需要進入依賴注入細節的示例。 – Charleh

+0

@Charleh - 到目前爲止,您的評論對我來說最有意義。因此,想法是將靜態調用隔離到數據源的調用,以避免在存在多個存儲庫實例時重新打開連接。對? – Heliac

回答

1

我不認爲這是與儲存庫特別相關。 該方法是靜態的,因爲它不使用任何類實例變量。由於您不需要在堆棧上傳輸this引用,因此性能稍有提高。
因爲它也是私有的,所以可以安全地將其標記爲靜態。對於非私有方法,這是不同的,因爲如果從外部使用靜態方法,調用者將自己綁定到靜態方法定義的具體類型。這使得設計不夠靈活並且降低了可測試性。但如前所述,這對私人方法來說不是問題。

+2

它在功能上也是'純粹' - >免於實例實現和可能因更改成員和屬性而產生的副作用。 – Gusdor

+0

@Gusdor該方法讀取文件的內容,因此遠不是功能純粹的,因爲它是非確定性的,基於文件是否在那裏以及它是什麼。它也可能導致在構造函數中拋出異常。 –

+0

@DavidArno我用'purer'(一個相對術語)來限定我的陳述。我沒有說所有的副作用都被廢除了。畢竟,IO代碼只能做很多事情。我應該知道在SO上調用'p'這個詞:P – Gusdor

1

(1)這不是延遲加載。 (2)如果你看到LoadCustomers中的註釋,他明確提到'在真實的應用程序中,數據來自外部來源,但對於這個演示,讓我們保持簡單並使用資源文件。'。這意味着,他的目的是在UI中顯示一些數據,而不是將某些商店的數據帶入UI的最佳方式。

正如通過評論所述,在生產質量代碼中,我們主要遵循一些良好定義的d模式。例如:在您的視圖模型中通過依賴注入注入存儲庫對象。

+0

我同意,這不是懶加載。事實上,如果它沒有明確標記爲簡化演示,那麼*懶惰編碼*會是一個更好的描述。 +1爲好的答案。 –

+0

我會將我的存儲庫存入我的視圖模型中,而且我不需要從ctor調用靜態方法。對不起,但我不明白這是如何適用的。 – Heliac

相關問題