0

使用存儲庫模式處理視圖(不代表實體但用於綁定DropDown列表的類)的最佳方式是什麼?比如我有一個以下客戶實體使用存儲庫模式處理視圖

public class Customer { 
    Guid ID {get;set;} 
    string FirstName {get;set;} 
    string LastName {get;set;} 
    List<Address> Addresses {get;set;} 
} 

和庫

public class CustomerRepository : IRepository<Customer> { 
    Customer GetByID(Guid id) { ... } 
    List<Customer> GetAll() { ... } 
    // Insert/Delete/Update Customer etc. 
} 

現在我要填寫客戶與他們的基地地址一起列表的下拉列表中,使用他們的ID作爲一個值屬性。我有一個存儲過程返回這個數據,我可以檢索其結果爲以下對象的列表:

public class CustomerWithBaseAddress { 
    public Guid CustomerID {get;set;} 
    public string FullNameWithBaseAddress { get;set; } 
} 

如若客戶資料庫回報這樣的對象,還是應該由不同的,專門的倉庫(但沒有保存/管理刪除操作)?

回答

1

存儲庫應該只處理一個聚合根,它是聚合。這意味着它可以處理Customer,CustomerOrders

A CustomerWithBaseAddress然而,它是一個ViewModel並且與數據庫無關。它應該使用存儲庫在控制器中構建。

您可以使用AutoMapper或類似的映射。

+0

你是什麼意思「它應該使用存儲庫在你的控制器中構建」? - 如果我理解正確,那麼在這種情況下,如果我使用存儲庫檢索客戶,然後將這些結果映射到CustomerWithBaseAddress,那麼這不會浪費大量資源嗎? (客戶聚合事實上比我在我的示例中寫的要複雜得多,因此我會在CustomerWithBaseAddress視圖模型中檢索很多不需要的Customer數據。 – 2011-05-03 15:19:17

+0

我誤讀了。我雖然'CustomerWithBaseAddress'繼承了'Customer'。道歉。由於'CustomerWithBaseAddress'是由某種數據庫查詢創建的,因此我會將其放入存儲庫中。 – jgauffin 2011-05-03 17:30:32

1

如果您需要這樣的對象不屬於您的域,並且將它們從域對象組裝起來過於昂貴,請創建一個查找服務。基本上只是一個服務,在一個單獨的程序集中調用一個特殊的存儲庫,這個程序集不屬於你的正式域模型。只要你只使用從這個服務獲得的對象作爲查找等,他們是扔掉的,不需要管理。

但是,對於可以作爲域對象使用的對象,您必須小心使用此方法。確保你沒有使用CustmerWithBaseAddress來做下拉選擇等選擇。因此,只要你選擇了CustmerWithBaseAddress對象,你應該得到真正的Customer對象,而不是讓CustmerWithBaseAdress泄漏到應用程序代碼的其餘部分。

+0

也看看CQRS架構模型。 – 2011-05-11 09:14:02