2013-06-06 12 views
5

AutoMapperの使用方法を学習しており、ValueFormatterで使用する際に問題が発生しています。ここでValueFormatterを使用したAutoMapper

は私がNameFormatterでそれを使用することができませんよコンソールに簡単な例です:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Mapper.Initialize(x => x.AddProfile<ExampleProfile>()); 

     var person = new Person {FirstName = "John", LastName = "Smith"}; 

     PersonView oV = Mapper.Map<Person, PersonView>(person); 

     Console.WriteLine(oV.Name); 

     Console.ReadLine(); 
    } 
} 

public class ExampleProfile : Profile 
{ 
    protected override void Configure() 
    { 
     //works: 
     //CreateMap<Person, PersonView>() 
     // .ForMember(personView => personView.Name, ex => ex.MapFrom(
     //  person => person.FirstName + " " + person.LastName)); 

     //doesn't work: 
     CreateMap<Person, PersonView>() 
      .ForMember(personView => personView.Name, 
      person => person.AddFormatter<NameFormatter>()); 
    } 
} 

public class NameFormatter : ValueFormatter<Person> 
{ 
    protected override string FormatValueCore(Person value) 
    { 
     return value.FirstName + " " + value.LastName; 
    } 
} 

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class PersonView 
{ 
    public string Name { get; set; } 
} 

は、私はここで何をしないのですか? AutoMapperはあなたがValueResolver(もう少しに関する情報here)を使用する必要がありますバージョン2.2.1

答えて

4

です:

public class PersonNameResolver : ValueResolver<Person, string> 
{ 
    protected override string ResolveCore(Person value) 
    { 
     return (value == null ? string.Empty : value.FirstName + " " + value.LastName); 
    } 
} 

と、あなたのプロフィールは次のようなものでなければなりません:著者によると

public class ExampleProfile : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Person, PersonView>() 
      .ForMember(personView => personView.Name, person => person.ResolveUsing<PersonNameResolver>()); 
    } 
} 

Formattersグローバルな型変換用です。彼の返信の一部はherehereです。

私はあなたのオプションの最初のために行くだろう:

CreateMap<Person, PersonView>() 
     .ForMember(personView => personView.Name, ex => ex.MapFrom(
      person => person.FirstName + " " + person.LastName)); 

、明らか値フォーマッタはmistakeされています。

+1

ありがとうございます、これはうまくいきますが、明白な疑問は、なぜリゾルバでフォーマッタではないのでしょうか? –

+0

私は自分の答えを更新しました。 – LeftyX

+0

もう一度ありがとうございます。私は明らかに私の研究のための最近の本を使用する必要があります;) –