2011-08-03 22 views
2

當我需要時,我明確加載了我的POCO上的關係,但自從我切換到AutoMapper後,我想我可以指示它爲我預加載關係,以便我的服務層代碼清潔:帶有顯式加載的AutoMapper和實體框架POCO

Mapper.CreateMap<Issue, IssueEditModel>().BeforeMap((i, m) => 
     LoadProperties<Issue>(() => 
      { return kernel.GetService<IIssuesRepository>(); }, 
      i, new Expression<Func<Issue, object>>[] 
      { 
       e => e.RelationshipA, 
       e => e.RelationshipB 
      } 
     ) 
); 

的LoadProperties方法查找使用使用的ObjectContext的LoadProperty方法DependencyResolver和負荷關係上市資源庫。現在,我的服務可以輕鬆地映射EF POCO以通過單個Mapper.Map調用查看模型。

有沒有人試過這個?什麼是潛在的陷阱?將所有這些LoadProperty調用保留在服務/存儲庫層中並保持儘可能簡單的AutoMapper映射是否有意義?

讓我感到困擾的是,您可以讓AutoMapper爲您做很多繁瑣的工作,比如從視圖模型轉換爲POCO時轉換類型和通過ID查找實體,但同時這會將此「邏輯」從您的服務/存儲庫爲AutoMapper配置。如果您有豐富的經驗,請分享您的想法。

+0

這可能有幫助,http://blog.stevensanderson.com/2011/01/28/mvcscaffolding-one-to-many-relationships/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+SteveCodeville+%28Steve+% 40 + Codeville%29它是一個獨立的根,我從來沒有真正理解爲什麼人們想做這麼多,什麼時候都可以爲你做 – davethecoder

回答

0

我一直在閱讀更多關於域驅動設計和您的web應用程序中圖層的責任,現在我意識到我一直在濫用AutoMapper。僅僅因爲我能做到這些,並不意味着我應該這樣做。其中一個缺陷是測試。因爲我對AutoMapper的調用最終敲擊數據庫以解決某些關係,所以我不能將這些映射用於單元測試,所以我必須爲我的測試創建一組不同的映射。

您的存儲庫應該預先加載必要的關係。人們建議讓方法接受標誌來控制是否應該使用Include來加載某個關係。就我而言,我認爲當實體處於多方時,我將始終加載多對一關係,並在檢索單個實體時(例如,詳細視圖)加載所有關係。