2010-02-10 63 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))); 
相关问题