2017-10-11 5 views
2

.NETでコンベンショナルベースのオブジェクトオブジェクトマッパーについて読んでいたhttps://github.com/AutoMapper/AutoMapper。 2つのオブジェクト間のプロパティをマップすることができます。私の質問は、このマッパーを使用する必要があるときです。私のコードで、ソースオブジェクトとデスティネーションオブジェクトの型が同じであるとすると、このマッパーが必要ですか? 例えば、私は次のように、単純=操作を使用して、同じタイプのオブジェクトをマッピングすることができる: - この場合、ソース・オブジェクトが宛先プロパティとともに保存されるソースとターゲットタイプが同じである場合、asp.net Auto Mapperを使用する必要があります

Staff source = new Staff() 
{ 
FirstName= "Source First", 
LastName = "Source Last", 
Age =22, 
Address = "Soruce 123..." 
}; 

Staff destination = new Staff() 
{ 
FirstName= "Destination First", 
LastName = "Destination Last", 
Age =20, 
Address = "Destination 123..." 
}; 

source = destination; 
entities.Staffs.Add(source); 
entities.Save(); 

?私はオートマッパーを使用する必要はありませんか?これは正しいです ?

+0

私は通常、AutoMapperを使用してDTOとモデルの間をマッピングします。プロパティ名は常に整列しているとは限らず、一部のDTOにはプロパティがフラットになっている場合があります。 – phuzi

+1

この場合、新しいインスタンスはなく、元の 'source'への参照を失います。 AMはオブジェクトをクローンして2つのインスタンスを取得します。もちろん、これを日常的に行う場合は、 'ICloneable'を実装する方が良いでしょう。 –

+0

私はAutomapperを使わず、代わりに明示的なマッピングを行うと言っていますが、私だけのことです。 – UrbanEsc

答えて

1

source = destination;を使用しています。宛先オブジェクトのメモリ位置の参照のみをコピーします。あなたが提供した例では、エンティティにオブジェクトを追加しているので、それは本当に重要ではありません。

別のメモリ位置にオブジェクトの完全なクローンを作成してオブジェクトで他の処理を行うには、ICloneableとMemberwiseCloneを使用します。マッピングが完全に同じものに対してAutoMapperを使用しない場合は、

public class Staff : ICloneable 
{ 
    public string FirstName{get;set;} 
    public string LastName{get;set;} 
    public int Age{get;set;} 
    public string Address{get;set;} 

    public object Clone() 
    { 
     return this.MemberwiseClone(); 
    } 
} 

その後、あなたはこれが唯一の浅いコピーを許可しますsource = (Staff)destination.Clone();

を使用することができます。深いコピーが必要な場合は、you can serialize and deserialize

+0

しかし、次のようなことをするだけで何が問題になるでしょうか? 'source = destination;' ??私が必要とするのは、destinatinと同じ値でデータベース内にソースオブジェクトを保存することです。 –

+0

クラスオブジェクトの場合、 'source = destination'と言うと、そのプロパティ値を値でコピーせず、代わりにメモリ位置'destination'オブジェクトのポインタを' source'オブジェクトのポインタに保存します。つまり、2つのオブジェクトがヒープ上の同じメモリ位置を指し示すことになります。 1つに変更を加えると、両方に反映されます。むしろ2つのオブジェクトを持ち、それぞれのオブジェクトは任意の値の変更に対して独立しています。 – Amit

+0

DB保存用のエンティティに単純に追加するだけなので、正常に動作しますが、一般的なコードでは不正な方法です。 – Amit

1

あなたには、いくつかの疑問を持っているので、私はそれらを個別にお答えしようとするでしょう:

私たちは、このマッパーを使用する必要がある場合?

あなたは(通常はこのようなケースではないが、同じタイプのものとすることができる)別のオブジェクトのプロパティに基づいて、オブジェクトのプロパティの数を設定したいときは、AutoMapperを使用しています。

私のコードでソースとデスティネーションオブジェクトのタイプが同じであるとすれば、このマッパーが必要ですか?

ソースオブジェクトを同じ(オブジェクト参照)にするか、すべてのタイプのプロパティをコピーするかによって異なります。これが当てはまらない場合、この場合でもAutoMapperは便利です(両方のタイプが同じ場合でも)。例えば

、私は彼らが同等の操作ではない単純=操作

を使用して、同じタイプのオブジェクトをマッピングすることができます。代入演算子(destination = source)がオブジェクト参照を置き換えるので、変数destinationは変数sourceObject.referenceEquals(source, destination) == true)と同じオブジェクトを参照します。

Mapper.Map<Source, Destination>(source, destination)を使用する場合、基本的にsourceオブジェクトのすべてのプロパティを設定していますが、それでも同じオブジェクト(Object.referenceEquals(source, destination) == false)です。

+0

しかし、最後にソースオブジェクトを保存すると、DB内に保存される値は宛先値と同じになります。これは私が必要なものです... –

+1

@jonh G、はい、コピーしたい場合すべてのプロパティとあなたは2つのオブジェクトを持っていることに気をつけません、AutoMapperは不要です:) –

関連する問題