2011-07-19 8 views
3

AutoMapperを使用してオブジェクトに別のオブジェクトの詳細を記入することは可能でしょうか?例えば、(前の構成を想定):誰もがもっと別のオブジェクトへのオブジェクトの照合用データをマージするようになるマッピングのこの明らかに奇妙な使用を試みた場合AutoMapper Data Filling

var foo = new Foo { PropA = "", PropB = "Foo" }; 
var bar = new Bar { PropA = "Bar", PropB = "" }; 

Mapper.Map<Foo, Bar>(foo, bar); 

Console.WriteLine(bar.PropB); //Returns "Foo" 

ちょうど疑問。

ありがとうございます!

更新:

ValueInjectorは、このような状況のためにあまりにもより適切であるように見えます。既にStackOverflowにあるAutoMapperとValueInjecterの適切な使い方について、いくつかの素晴らしい議論があります。

+1

AutoMapperは限りプロパティ名が一致するようオブジェクトを別のオブジェクトにマッピングします。これはまさにAutoMapperのために作られたものです – boca

+0

他人にも尋ねる前にこれを試してみてください。 FWIW:Automapperは問題解決のために設計されています... – Scrappydog

+0

よくそれは私が価値インジェクションAla ValueInjecterを探していたように見えます。それはこの問題のより適切な解決策であるように見えます。役に立つアドバイスを提供してくれてありがとう。 – jdscolam

答えて

5

プロパティ名が一致すると、自動的にマップされます。なんらかの理由で自分でマッピングを指定することができない場合。

PropAはPropertyAと一致しませんので、マッピングを指定する必要があります。しかし、PropBは一致するので、そうではありません。

var foo = new Foo { PropA = "", PropB = "Foo" }; 
var bar = new Bar { PropertyA = "Bar", PropertyB = "" }; 

Mapper.CreateMap<Foo, Bar>() 
     .ForMember(dest => dest.PropertyA, opt => opt.MapFrom(src => src.PropA)); 

Mapper.Map<Foo, Bar>(foo, bar); 
+0

私は、ValueInjecterが私の特定のケースでうまくいったと思いますが、あなたの答えも気に入っています。そう受け入れられる! – jdscolam

0

他の人は言っているように、あなたは本当に投稿する前に多くの宿題をする必要があります。しかし、Mapper.AssertConfigurationIsValidメソッドを見ていてください。

これはマッピングが機能するかどうかを示します。そうでない場合は、適用されないプロパティを教えてくれます。失敗したマッピングが何であるか分かると、.ForMemberメソッドを使用して特定のマップを作成できます。

2

だけでなく、ValueInjecterであなたが

bar.InjectFrom(foo); 

を行うことができますし、あなたのバーは次のようになります。

{PropA = "", ProbB = "Foo"}, 

正確な方法はFooが だったが、あなたは唯一の非ヌルを取る希望の場合/この値を取得する空の値

{PropA = "Foo", PropbB = "Bar"} 

新しい注入を作成することができます

public class NonNullEmptyInj : ConventionInjection 
{ 
     protected override bool Match(ConventionInfo c) 
     { 
     if (c.SourceProp.Name != c.TargetProp.Name 
          || c.SourceProp.Type != c.TargetProp.Type) return false; 
     if(c.SourceProp.Value == null) return false; 
     if (c.SourceProp.Type == typeof(string) && c.SourceProp.Value.ToString() == string.Empty) return false; 
     return true; 
     } 
} 

とこのようにそれを使用します。

bar.InjectFrom<NonNullEmptyInj>(foo); 
+0

私はValueInjecterをかなり好きですが、これらのデフォルトの規約のうちのいくつかをボックスから取り除く必要があるという人の意見に同意します。それは本当に採用に役立つだろう。すべてのあなたのVI上の仕事をありがとう! – jdscolam

+0

@jdscolamデフォルトの規約はありますか? – Omu