2009-11-08 2 views
4

내가 컨트롤러에서 사용자 정의 ViewModels에 검색 도메인 개체의 목록을 변환하는 가장 좋은 방법을 알고 싶습니다

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

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

그것은 내가 그것이 IList의 일 필요는 없습니다 즉, 위에서 설명한 직접 서비스에 액세스하지 않을 경우 대신 통해 이동 한대로 정확하게 일 필요는 없습니다 객체를 뷰 모델로 변환하는 다른 레이어도 괜찮습니다.

감사

답변

6

간단한 개체의 당신은 그냥 사용할 수 있습니다 Linq에 : 당신이 당신의 BallViewModel 클래스 공을 받아들이고을하는 생성자를 제공 할 수 있도록, 그래도 꽤 반복적 얻을 수

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

당신을 위해 일합니다.

또 다른 방법은 AutoMapper과 같은 라이브러리를 사용하여 도메인 객체의 속성 (심지어 중첩 된 객체)을 뷰 모델로 복사하는 것입니다.

1

아마 내가 AutoMapper를 사용 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

+0

답변을 많이, 손으로 그것을 할 다른 방법, 반사의 창조적 인 사용 (내가 AutoMapper 가정 할 무엇입니까) 사이에 아마 물건 - linq 간단하고 효과적이고 따라서 명백한 대답입니다. – Murph

1

의 비트는이 모든 시간을 할 수 있습니다. 그것은 정말 유연하고 지금까지 아무런 문제없이 저를 위해 일해 왔습니다.

먼저 당신은 같은 앱의 초기화하는 동안지도를 설정 :

Mapper.CreateMapping<Balls, BallViewModel>(); 

을 그리고 당신은 개체를 매핑해야 할 때마다, 당신은이 작업을 수행 할 것입니다 : 내가 말했듯이

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

, 그것은 아주이다 유동적 인 API를 사용하여 각 속성에 대한 매핑이 어떻게 적용되는지 수정할 수 있습니다.

+0

니스 - 조사해야합니다. – Murph