映射

2014-03-30 43 views
0

我映射我的一些代碼,服務層內,如下所示:映射

var authors = _repository.FindAll().Where(x => x.IsActive == 1).ToList(); 
authorViews = authors.ModelToViewModelCollection(); 

但我的前輩勸我映射庫層內如下:

return (from c in Context.Books 
        .Where(x=>x.IsActive == 1) 
        select new BookDetailsView 
        { 
         ID = c.ID, 
         TitleB = c.TitleB, 
         TitleE = c.TitleE, 

        }).ToList(); 

的區別是什麼在兩者之間。

回答

1

的主要區別在於,在第一種情況下,控制器(或服務)將直接操縱EF建立查詢。不管你如何寫它,這不是存儲庫模式。

第二種方法保持在倉庫裏的EF操作和直接返回視圖模型,因而上層不知道你正在使用EF並沒有建立一個查詢。

庫的目的是從持久性脫鉤其他層即其他層只知道有關存儲庫,並只與特定的給它們的對象處理。這樣,持久性可以優化對象的存儲/檢索方式,而不會影響其他圖層。這意味着你可以在你的持久化中使用EF,Nhibernate,mongo db等,這取決於應用程序和業務層的最佳狀態,或者UI永遠不知道它,並且當你改變持久性時永遠不需要改變。

如果你想知道你多少時間切換分貝或改變持久性,開關db是非常罕見的,但不斷變化的持久性模型(表,列等)是很經常,開發時尤其如此。存儲庫可幫助您僅在持久性中保留更改。

+0

數據檢索時有什麼影響?假設我的模型類有8個屬性,但viewmodel類僅包含03.如果我遵循第二個選項,有機會提高數據檢索性能? –

+0

通過你的模型,我想你是指EF(持久性)模型。該存儲庫不是爲了改善性能,而是爲了保持事物分離。就你而言,我認爲沒有性能差異,查詢將是相同的,但對於涉及更復雜模型的其他情況,存儲庫允許您靈活地執行所有需要的db魔法。 – MikeSW