2010-02-10 108 views

回答

113

使用ConstructUsing

這將允許您指定的映射過程中使用哪個構造。但隨後所有其他屬性將根據約定自動映射。

另外請注意,這是不同於ConvertUsing在轉換使用將不會繼續映射通過約定,它會讓你完全控制的映射。

Mapper.CreateMap<ObjectFrom, ObjectTo>() 
    .ConstructUsing(x => new ObjectTo(arg0, arg1, etc)); 

...

using AutoMapper; 
using NUnit.Framework; 

namespace UnitTests 
{ 
    [TestFixture] 
    public class Tester 
    { 
     [Test] 
     public void Test_ConstructUsing() 
     { 
      Mapper.CreateMap<ObjectFrom, ObjectTo>() 
       .ConstructUsing(x => new ObjectTo(x.Name)); 

      var from = new ObjectFrom { Name = "Jon", Age = 25 }; 

      ObjectTo to = Mapper.Map<ObjectFrom, ObjectTo>(from); 

      Assert.That(to.Name, Is.EqualTo(from.Name)); 
      Assert.That(to.Age, Is.EqualTo(from.Age)); 
     } 
    } 

    public class ObjectFrom 
    { 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 

    public class ObjectTo 
    { 
     private readonly string _name; 

     public ObjectTo(string name) 
     { 
      _name = name; 
     } 

     public string Name 
     { 
      get { return _name; } 
     } 

     public int Age { get; set; } 
    } 
} 
+0

我猜「ConstructUsing」必須在一個較新版本的automapper比一個w在使用。感謝Jon – jlembke 2010-02-10 19:33:23

+6

非常感謝這個例子Jon。 「ConstructUsing」非常棒!允許我使用標記爲私有的setter來保持我的DTO不可變。 – Daniel 2010-11-08 00:46:59

+3

爲我工作, AutoMapper目前不喜歡所有參數都是可選的構造函數,所以我只是使用.ConstructUsing(x => new MyClass()); – 2011-04-11 23:56:12

7

您應該使用Map方法,可以讓你設定的目標。例如:

Mapper.CreateMap<ObjectFrom, ObjectTo>() 

var from = new ObjectFrom { Name = "Jon", Age = 25 }; 

var to = Mapper.Map(from, new ObjectTo(param1)); 
0

在寫這個答案的時候,AutoMapper將自動(用一個簡單的電話CreateMap<>())爲您如果屬性匹配的構造函數的參數做到這一點。當然,如果事情不匹配,那麼使用.ConstructUsing(...)即可。

public class PersonViewModel 
{ 
    public int Id { get; set; } 

    public string Name { get; set; } 
} 

public class Person 
{ 
    public Person (int id, string name) 
    { 
     Id = id; 
     Name = name; 
    } 

    public int Id { get; } 

    public string Name { get; } 
} 

public class PersonProfile : Profile 
{ 
    public PersonProfile() 
    { 
     CreateMap<PersonProfile, Person>(); 
    } 
} 

注意:假設您使用Profiles來設置自動映射器映射。

當一個像下面使用,這將產生正確的對象:

var model = new PersonModel 
{ 
    Id = 1 
    Name = "John Smith" 
} 

// will correctly call the (id, name) constructor of Person 
_mapper.Map<Person>(model); 

您可以在官方wiki on GitHub

2

最佳實踐瞭解更多關於automapper建設是從AutoMapper https://github.com/AutoMapper/AutoMapper/wiki/Construction

使用記錄的方法
public class SourceDto 
{ 
     public SourceDto(int valueParamSomeOtherName) 
     { 
      Value = valueParamSomeOtherName; 
     } 

     public int Value { get; } 
} 

Mapper.Initialize(cfg => cfg.CreateMap<Source, SourceDto>().ForCtorParam("valueParamSomeOtherName", opt => opt.MapFrom(src => src.Value))); 
相關問題