2011-07-21 7 views
6

Tôi cần trợ giúp với ánh xạ đặc biệt với AutoMapper. Tôi muốn ánh xạ một tập hợp các đối tượng vào một tập hợp các chuỗi.AutoMapper: Lập bản đồ bộ sưu tập của đối tượng đến một tập hợp các chuỗi

Vì vậy, tôi có một Tag ClassD

public class Tag 
{ 
    public Guid Id { get; set; } 
    public string Name {get; set; } 
} 

hơn trong một mô hình tôi có một IList của lớp này. Bây giờ tôi muốn ánh xạ tên của một tập hợp các chuỗi.

Thats làm thế nào tôi xác định quy tắc lập bản đồ:

.ForMember(dest => dest.Tags, opt => opt.ResolveUsing<TagNameResolver>()) 

Và đây là ValueResolver tôi:

protected override string ResolveCore(Tag source) 
{ 
    return source.Name; 
} 

Nhưng u biết .. nó không làm việc ;-) Vì vậy, có lẽ ai đó biết làm thế nào để làm nó đúng và có thể giúp tôi.

thx rất nhiều

Jan

Sooo .. u muốn biết thêm chi tiết .. u ở đây có được nó .. nhưng tôi có rút ngắn nó;)

Vì vậy, Model:

public class Artocle 
{ 
    public Guid Id { get; set; } 
    public string Title {get; set; } 
    public string Text { get; set; } 
    public IList<Tag> Tags { get; set; } 
} 

Và mô hình Thẻ u có thể thấy ở trên.

Tôi muốn ánh xạ nó tới một ArticleView ... tôi chỉ cần mô hình thẻ cho một số ngữ cảnh kinh doanh, không phải cho đầu ra tthe.

Vì vậy, đây là ViewModel tôi cần để ánh xạ:

public class ArticleView 
{ 
    public Guid Id { get; set; } 
    public string Title { get; set; } 
    public string Text { get; set; } 
    public IList<string> Tags { get; set; } // The mapping problem :-) 
} 

Vì vậy, tôi có một bootstrapper cho ánh xạ. Lập bản đồ của tôi trông như thế này:

Mapper.CreateMap<Article, ArticleView>() 
.ForMember(dest => dest.Tags, opt => opt.ResolveUsing<TagNameResolver>()) 

Và tôi đồ nó manuelly với một phương pháp đặc biệt

public static ArticleView ConvertToArticleView(this Article article) 
    { 
     return Mapper.Map<Article, ArticleView>(article); 
    } 
+0

Bạn có thể cung cấp thêm thông tin về các lớp nguồn và đích không? –

+0

Vì vậy, thats tất cả tôi làm :) Tôi hy vọng phiên bản của tôi có thể giúp :) – Smokefoot

Trả lời

13

Một thử nghiệm đơn vị xác nhận sau đây sẽ lập bản đồ từ IList <Tag> để IList <string>

private class TagNameResolver : ValueResolver<IList<Tag>, IList<string>> 
     { 
      protected override IList<string> ResolveCore(IList<Tag> source) 
      { 
       var tags = new List<string>(); 
       foreach (var tag in source) 
       { 
        tags.Add(tag.Name); 
       } 
       return tags; 
      } 
     } 

Đây là cách tạo bản đồ ngắn hơn:

.ForMember(dest => dest.Tags, opt => opt.MapFrom(so => so.Tags.Select(t=>t.Name).ToList())); 
+1

Damn .. nó dễ dàng như vậy^^ cảm ơn u rất nhiều havnt nghĩ về cách này: D * xấu hổ * – Smokefoot

+0

Chào mừng bạn. Tôi cũng đã thêm một tùy chọn ngắn. –

+1

Oh tùy chọn thứ hai của bạn là tuyệt vời. Cảm ơn rất nhiều. – Smokefoot