2015-12-15 105 views
3

在構造函數中注入我有下面的類結構:映射子類與父使用AutoMapper

class SrcChild 
{ 
    public bool SomeProperty { get; set; } 
} 

class SrcParent 
{ 
    public IEnumerable<SrcChild> Children { get; set; } 
} 

所以SrcParent具有SrcChild對象的集合。

現在我想將SrcParent的一個實例映射到DstParent。這裏有目的地類:

class DstChild 
{ 
    public bool SomeProperty { get; set; } 

    public DstChild(DstParent parent) 
    { 
     if (parent == null) 
      throw new ArgumentNullException(); 
    } 
} 

class DstParent 
{ 
    public IEnumerable<DstChild> Children { get; set; } 
} 

的DstParent有DstChild對象的集合,即使用構造函數注入,以保持他們的家長參考。

使用AutoMapper,我嘗試以下:

class Program 
{ 
    static void Main(string[] args) 
    { 
     /* mapping configuration */ 
     Mapper.CreateMap<SrcChild, DstChild>() 
      .ConstructUsing(
       resolutionContext => new DstChild((DstParent)resolutionContext.Parent.DestinationValue)); 
     Mapper.CreateMap<SrcParent, DstParent>(); 

     /* source parent object with two children */ 
     var srcParent = new SrcParent 
     { 
      Children = new[] { new SrcChild(), new SrcChild() } 
     }; 

     /* throws an exception */ 
     var dstParent = Mapper.Map<DstParent>(srcParent); 

     Console.ReadKey(); 
    } 
} 

主要部分這裏是我試圖提取映射上下文參考產生DstParent的AutoMapper配置。這不起作用((DstParent)resolutionContext.Parent.DestinationValue爲null),但也許我完全錯過了一個點?

另一個想法我是使用一個函數來創建子值,像這樣:

class Program 
{ 
    /* Should produce value for DstParent.Children */ 
    private static IEnumerable<DstChild> MakeChildren(SrcParent src /*, DstParent dstParent */) 
    { 
     var result = new List<DstChild>(); 
     // result.Add(new DstChild(dstParent)); 
     return result; 
    } 

    static void Main(string[] args) 
    { 
     /* mapping configuration */ 
     Mapper.CreateMap<SrcChild, DstChild>(); 
     Mapper.CreateMap<SrcParent, DstParent>() 
      .ForMember(dst => dst.Children, 
       opt => opt.MapFrom(src => MakeChildren(src /*, How to obtain a reference to the destination here? */))); 

     /* source parent object with two children */ 
     var srcParent = new SrcParent 
     { 
      Children = new[] { new SrcChild(), new SrcChild() } 
     }; 

     var dstParent = Mapper.Map<DstParent>(srcParent); 

     Console.ReadKey(); 
    } 
} 

,但我不知道如何(如果連有可能的話),以獲得參考DstParent由Mapper生成的對象。

有沒有人有一個想法如何做到這一點,或者我應該考慮完全放棄這個設計,擺脫父親的參考?提前致謝。

回答

0

好吧,我發現了一個解決方案是不漂亮,但它的工作原理:

class Program 
{ 
    static IEnumerable<DstChild> MakeChildren(IEnumerable<SrcChild> srcChildren, DstParent dstParent) 
    { 
     var dstChildren = new List<DstChild>(); 
     foreach (SrcChild child in srcChildren) 
     { 
      var dstChild = new DstChild(dstParent); 
      Mapper.Map(child, dstChild); 
      dstChildren.Add(dstChild); 
     } 
     return dstChildren; 
    } 

    static void Main(string[] args) 
    { 
     Mapper.CreateMap<SrcChild, DstChild>(); 
     Mapper.CreateMap<SrcParent, DstParent>() 
      /* Ignore Children property when creating DstParent*/ 
      .ForMember(dst => dst.Children, opt => opt.Ignore()) 
      /* After mapping is complete, populate the Children property */ 
      .AfterMap((srcParent, dstParent) => 
      { 
       dstParent.Children = MakeChildren(srcParent.Children, dstParent); 
      }); 

     var source = new SrcParent 
     { 
      Children = new[] 
      { 
       new SrcChild() {SomeProperty = true}, 
       new SrcChild() {SomeProperty = false} 
      } 
     }; 

     var destination = Mapper.Map<DstParent>(source); 

     Console.ReadKey(); 
    } 
} 

目標已初始化,與AutoMapper正確分配SomeProperty孩子。請讓我知道,如果你找到一個更好看的解決方案。