2010-06-04 55 views
1

我正在尋找一種很好的方式來向強類型列表中的對象添加任意屬性,原因是我不應該將DataTable從業務層傳遞到我的表示層。向強類型列表中添加任意屬性

例如,我可能有一個類別類屬性的CategoryId標題。在一頁上,我想獲取所有類別的列表(即List<Category>)以及每個類別中最昂貴的產品。

前一陣子,我會剛剛返回一個DataTable,其中有一些額外的列與產品數據,但我試圖不這樣做 - 這將是微不足道的設置它不是很好的做法。

一種選擇是一個MostExpensiveProduct屬性添加到我的類別類,但我可能想顯示在另一種情況下,或最便宜的產品最近添加的產品,所以我最終加入了很多的物業涵蓋所有選項。這只是不適合我。

我在這裏錯過了一招嗎?這樣做的最好方法是什麼?或者我應該只是返回一個DataTable,我可以根據需要添加儘可能多的列,而不用擔心它?

+0

你可能想重新提出你的問題。您不能將任意屬性添加到非動態(強類型)類。這就像說「我的水可以幹嗎?」。 – jfar 2010-06-04 14:42:26

+0

@jfar感謝您的評論,我知道您的意思,但想不到更好的方式來重新提出我的問題! – philwilks 2010-06-06 15:18:15

回答

0

這個問題似乎是你有很多不同的意見,你想提供給用戶。我看到的選項是:

  • 您可以爲繼承自Category類的每個視圖構造單獨的類。代碼gen將是一個很好的解決方案。
  • 您可以存儲Attributes屬性,該屬性具有IDictionary接口,並通過鍵引用項目。我正在成爲這種方法的粉絲。
  • 您可以生成數據表僅用於綁定目的,這些視圖...或開發一個數據表,如組件,您可以通過鍵引用字段...
  • 對於您計算的字段(比如說您存儲銷售稅和淨價,並計算總成本),您可以將其存儲爲類別對象的方法或擴展方法。

我敢肯定有,我有沒有想過其他選項...

HTH。

+0

感謝您的快速響應。我喜歡你的第二個選項(具有IDictionary接口的屬性屬性)的聲音。 – philwilks 2010-06-04 11:52:13

+0

其他想法歡迎... – philwilks 2010-06-04 11:57:27

0

您應該爲每個只包含您感興趣在視圖中使用的屬性的視圖創建一個專門的類(視圖模型)。對於最簡單的情況來說,這看起來可能是不必要的重複,但在層次的一致性和分離方面會有所幫助。您可以手動構建視圖模型,或者如果這很乏味,請使用像AutoMapper這樣的對象 - 對象映射框架。

0

在這裏有幾件事要考慮恕我直言。首先,似乎從Category到Product的唯一參考應該是Category.Products,這意味着您絕對不應該有類似Category.MostExpensiveProdcut等內容。至於您的業務層,我會這樣做:

從您的表示層後面的代碼:

調用CategoryManager。GetCategories();
調用清單<產品> ProductManager.GetMostExpensiveProducts(清單<類別>);

現在您已經有了類別列表以及產品列表(假設您的產品有參考回到其類別),您可以獲得所有必要的信息。使用此設置,您的實體(類別,產品)不會受到污染。

要考慮的另一件事是引入一個服務層。如果你發現你不想(無論出於何種原因)向業務經理打兩次電話,而是想打一個電話,並且一次性獲得所有信息,我會考慮引入一個服務層,有時也稱爲「應用程序正面」。此門面將負責向業務經理進行個別調用,並將結果合併到一個響應中,然後再將其發送回UI層。有人提到該自定義對象將是一個「ViewModel」,這是正確的,但經常用於引用MVC。另一個名稱是DTO(數據傳輸對象),它被設計用於服務層/應用程序外觀。