2011-01-19 5 views
13

私はAutoMapperのドキュメントを参照して、これに推奨される解決策を見つけましたが、それを見つけることはできませんでした。プロパティをコレクションアイテムにマップする

のは、私は、次の

public class Foo 
{ 
    public string Note { get; set; } 
} 

このクラスは、クライアントから移入されますと

public class Note 
{ 
    public string Text { get; set; } 

    // other properties excluded for brevity 
} 
ある
public class Bar 
{ 
    public IList<Note> Notes { get; set; } 
} 

次のドメインオブジェクトクラスにマッピングされるようなクラスがあるとしましょう

Note文字列プロパティをにマップします。最初にNoteという新しいインスタンスのTextプロパティに移動し、NoteBarNotesコレクションに追加します。私はこの操作の最初の部分(Noteの新しいインスタンスに文字列をマッピングする)を実行するのにValueResolverを使用していますが、2番目の部分(その項目をコレクションの項目にマッピングする方法)についてはわかりません。

これを行う最もクリーンな方法は何ですか?

答えて

39

私は(テストしていません - ちょうど大声で入力して)、これは動作するはずのようなものを考えている:あなたはまた、AutoMappersにAfterMap機能を使用することができます

Mapper.CreateMap<Foo, Bar>().ForMember(d => d.Notes, 
    opt => opt.MapFrom(s => new List<Note> { new Note { Text = s.Note } }); 

EDIT。このラムダは、Automapperが通常のマッピングを行った後に実行されます。

.AfterMap((s,d) => d.Notes.Add(new Note { Text = s.Note })); 
+0

バーは、データソースから取り込まれたドメインオブジェクトです。私はこれが新しいドメインオブジェクトインスタンスへのマッピングを担当すると思いますが、ドメインオブジェクトがデータソースから読み込まれ、既にコレクションにアイテムを含んでいて、そのコレクションにアイテムを追加したいというケースを処理しますか? –

+0

AfterMapを使用するためのオプションで自分の答えを編集しました。また、複雑すぎる場合は、カスタムタイプコンバータを使用することもできます。http://automapper.codeplex.com/wikipage?title=Custom%20Type%20Converters – PatrickSteele

+2

MapAfterは適切な方向に向いてくれてありがとう:) –

関連する問題