2016-01-25 26 views
0

我有一個場景,我有一個基於接口的集合的域模型,這意味着可能有兩種可能的類型之一。然後我想將它映射到一個相似的視圖模型,但包含兩個集合,每個類型一個集合。AutoMapper可以根據類型將集合項目複製到特定的集合嗎?

是否有可能使用AutoMapper完成此操作,因此根據相關項目的類型將單個集合映射到兩個集合?

我在下面列出了一些示例對象,其中一個註釋掉了一行,其中一個顯示了我通過使用SourceType嘗試的內容,但找不到這種方法。

域對象

public interface IItemType 
{ 
} 

public class ItemTypeOne : IItemType 
{ 
} 

public class ItemTypeTwo : IItemType 
{ 
} 

public class DomainModel 
{ 
    public List<IItemType> Items; 
} 

視圖模型

public class ViewModel 
{ 
    public List<ViewModelItemOne> ItemTypeOnes = new List<ViewModelItemOne>(); 
    public List<ViewModelItemTwo> ItemsTypeTwos = new List<ViewModelItemTwo>(); 
} 

public class ViewModelItemOne 
{ 
    public List<ItemTypeOne> ItemTypeOnes; 
    public List<ItemTypeTwo> ItemsTypeTwos; 
} 

public class ViewModelItemTwo 
{ 
    public List<ItemTypeOne> ItemTypeOnes; 
    public List<ItemTypeTwo> ItemsTypeTwos; 
} 

映射

class Program 
{ 
    static void Main(string[] args) 
    { 
     var dm = new DomainModel() 
     { 
      Items = new List<IItemType>() 
      { 
       new ItemTypeOne(), 
       new ItemTypeOne(), 
       new ItemTypeOne(), 
       //new ItemTypeTwo() 
      } 
     }; 

     Mapper.CreateMap<DomainModel, ViewModel>(); 
     Mapper.CreateMap<ItemTypeOne, ViewModelItemOne>(); 
     Mapper.CreateMap<ItemTypeTwo, ViewModelItemTwo>(); 
     Mapper.CreateMap<DomainModel, ViewModel>().ForMember(dest => dest.ItemTypeOnes, opt => { opt.MapFrom(src => src.Items); }); 
     //Mapper.CreateMap<DomainModel, ViewModel>().ForMember(dest => dest.ItemTypeOnes, opt => { opt.Condition(con => con.SourceType == typeof(ItemTypeOne)); opt.MapFrom(src => src.Items); }); 

     var vm = Mapper.Map<ViewModel>(dm); 

     Console.WriteLine(vm.ItemTypeOnes.Count); 
     Console.WriteLine(vm.ItemsTypeTwos.Count); 
     Console.ReadKey(); 
    } 
} 

回答

1

可以通過聲明如何設置每個屬性做到這一點:

Mapper.CreateMap<DomainModel, ViewModel>() 
     .ForMember(dest => dest.ItemTypeOnes, 
       opt => opt.MapFrom(src => src.Items.Where(i => i is ItemTypeOne))) 
     .ForMember(dest => dest.ItemsTypeTwos, 
       opt => opt.MapFrom(src => src.Items.Where(i => i is ItemTypeTwo))); 

那麼這個測試將通過:

[TestClass] 
public class TC 
{ 
    [TestMethod] 
    public void T() 
    { 
     var dm = new DomainModel 
     { 
      Items = new List<IItemType> 
     { 
      new ItemTypeOne(), 
      new ItemTypeOne(), 
      new ItemTypeOne(), 
      new ItemTypeTwo() 
     } 
     }; 

     Mapper.CreateMap<DomainModel, ViewModel>(); 
     Mapper.CreateMap<ItemTypeOne, ViewModelItemOne>(); 
     Mapper.CreateMap<ItemTypeTwo, ViewModelItemTwo>(); 

     Mapper.CreateMap<DomainModel, ViewModel>() 
      .ForMember(dest => dest.ItemTypeOnes, opt => opt.MapFrom(src => src.Items.Where(i => i is ItemTypeOne))) 
      .ForMember(dest => dest.ItemsTypeTwos, opt => opt.MapFrom(src => src.Items.Where(i => i is ItemTypeTwo))); ; 

     var vm = Mapper.Map<DomainModel, ViewModel>(dm); 

     Assert.AreEqual(3, vm.ItemTypeOnes.Count); 
     Assert.AreEqual(1, vm.ItemsTypeTwos.Count); 
    } 
} 
+0

感謝現在我要看看,錯字固定的問題。正在嘗試使用dotnetfiddle來託管東西,但之前它有點片狀。 – rrrr

相關問題