2010-04-15 53 views
42

Tôi có hai lớp học như vậy:Automapper thất bại trong việc lập bản đồ trên IEnumerable

public class SentEmailAttachment : ISentEmailAttachment 
{ 
    public SentEmailAttachment(); 

    public string FileName { get; set; } 
    public string ID { get; set; } 
    public string SentEmailID { get; set; } 
    public string StorageService { get; set; } 
    public string StorageServiceFileID { get; set; } 
} 

public class SentEmailAttachmentItem : ISentEmailAttachment 
{ 
    [ItemName] 
    public string ID { get; set; } 
    public string SentEmailID { get; set; } 
    public string FileName { get; set; } 
    public string StorageService { get; set; } 
    public string StorageServiceFileID { get; set; } 
} 

giống hệt, như bạn có thể nhìn thấy (cả hai đều thực hiện giao diện để đảm bảo điều này)

Sau đó tôi có bản đồ sau:

Mapper.CreateMap<IEnumerable<SentEmailAttachmentItem>, IEnumerable<SentEmailAttachment>>(); 
Mapper.CreateMap<IEnumerable<SentEmailAttachment>, IEnumerable<SentEmailAttachmentItem>>(); 

sau đó tôi có kiểm tra đơn vị sau đây:

//create a load of sent email attachments 
var listOfSentEmailAttachments = new List<SentEmailAttachment>(); 

for (int i = 0; i < 10; i++) 
    listOfSentEmailAttachments.Add(new SentEmailAttachment { FileName = "testFileName", ID = Guid.NewGuid().ToString(), SentEmailID = Guid.NewGuid().ToString(), StorageService = "S3", StorageServiceFileID = "SomeFileID" }); 

var sentEmailAttachmentItems = Mapper.DynamicMap<IEnumerable<SentEmailAttachment>, IEnumerable<SentEmailAttachmentItem>>(listOfSentEmailAttachments); 

var itemToTest = sentEmailAttachmentItems.First(); 

Assert.IsInstanceOfType(itemToTest, typeof(SentEmailAttachmentItem)); 

này thất bại - Các IEnumerable sentEmailAttachmentItems trống. Nó không lập bản đồ danh sách SentEmailAttachments cho nó ...

Bất kỳ ý tưởng gì đang xảy ra ??

Tôi có nó làm việc trên các đối tượng duy nhất (lập bản đồ một trong mỗi cho một trong mỗi) nhưng không phải là một bộ sưu tập ...

Trả lời

93

Bạn không cần để ánh xạ một cách rõ ràng các loại bộ sưu tập, chỉ có các loại tài liệu. Chỉ cần làm:

Mapper.CreateMap<SentEmailAttachment, SentEmailAttachmentItem>(); 
var attachments = Mapper.Map<IEnumerable<SentEmailAttachment>, List<SentEmailAttachmentItem>>(someList); 

Điều đó sẽ chỉ hoạt động tốt.

11

EDIT: Tôi đã tìm thấy cách dễ dàng để sử dụng DynamicMap với các bộ sưu tập.

IEnumerable<FakeItem> unmappedItems = Repository.GetItems(); 
IEnumerable<MappedItem> mappedItems = unmappedItems.Select(Mapper.DynamicMap<MappedItem>); 

- Original nhắn -

Cách Jimmy nói để sử dụng nó hoạt động, nhưng tôi cố gắng sử dụng DynamicMap khi tôi có thể để tránh việc phải làm "CreateMap" cho mỗi bản đồ tôi cần. Tôi không nghĩ rằng DynamicMap làm việc với các bộ sưu tập rất tốt, nếu có. Nó không ném một ngoại lệ, nhưng kết quả là một tập rỗng.

Từ thử nghiệm trong vài ngày qua, bạn không thể sử dụng Bản đồ động cho các bộ sưu tập tại thời điểm này (mà tôi biết).

Các vấn đề liên quan