2009-11-08 44 views
4

我想知道我檢索到自定義的ViewModels控制器轉換域對象的列表的最佳方式我如何轉換域對象的列表的ViewModels的控制器在ASP.NET MVC

例如

IList<Balls> _balls = _ballsService.GetBalls(searchCriteria); 

IList<BallViewModels> _balls = _ballsService.GetBalls(searchCriteria); 

它不必完全一樣,我上面概述也就是說,它並不必須是一個IList,如果不能直接訪問該服務,而是走通其他一些將對象轉換爲視圖模型的圖層也可以。

感謝

回答

6

對於簡單的對象,你可以只使用Linq:

IList<BallViewModel> _balls = _ballsService.GetBalls(searchCriteria) 
    .Select(b => new BallsViewModel 
       { 
        ID = b.ID, 
        Name = b.Name, 
        // etc 
       }) 
    .ToList(); 

,可以得到相當重複的,所以你可能想給你的BallViewModel類接受一個球,做了一個構造函數爲你工作。

另一種方法是使用像AutoMapper這樣的庫將屬性(即使是嵌套的)從域對象複製到視圖模型。

1

可能有點LINQ中,沿着

var ballQuery = from ball in _ballsService.GetBalls(searchCriteria) 
       select new BallViewModels 
       { 
        Diameter = ball.Diameter, 
        color = ball.Color, 
        ... 
       } 
IList<BallViewModels> _balls = ballQuery.ToList(); 

如果不是這樣,這個問題比我想象的更復雜的東西線...

+0

吮吸只能給一個答案。謝謝 – kurasa 2009-11-09 00:57:36

+0

有很多答案,其他方法可以手工完成,創造性地使用反射(這是我認爲AutoMapper所做的),可能有些東西介於兩者之間 - 但linq很簡單而且有效,因此也是明顯的答案。 – Murph 2009-11-09 09:08:23

1

我使用AutoMapper到做這一切的時候。它非常靈活,並且迄今爲止沒有任何麻煩。

首先,你喜歡你的應用程序的初始化過程中建立了一個地圖:

Mapper.CreateMapping<Balls, BallViewModel>(); 

,每當你需要的對象圖,你可以這樣做:

Mapper.Map<IList<Balls>, IList<BallViewModel>>(_ballsService.GetBalls()); 

就像我說的,這是非常靈活,您可以使用流暢的API修改每個屬性映射的方式。

+0

不錯 - 必須進行調查。 – Murph 2009-11-09 09:08:53

相關問題