DTO オブジェクトをファクトリ クラスのエンティティ オブジェクトにマップしようとしています。DTO にはすべてのフィールド値がそのまま含まれていますが、エンティティには名前と値で構成されるフィールドがあります。
いくつかのデバッグの後、Automapper が既存のエンティティ フィールドを使用する代わりに各エンティティ フィールドをインスタンス化していることがわかりました。その結果、最後のテストは失敗します。
[TestFixture]
class RecursiveMappingTest
{
public class SourceInfo
{
public string Info1 = "info1";
public string Info2 = "info1";
}
public class StringField
{
public string Name;
public string Value;
}
public class DestinationInfo
{
public StringField Info1 = new StringField() { Name = "field name 1" };
public StringField Info2 = new StringField() { Name = "field name 2" };
}
[Test]
public void MapField()
{
Mapper.CreateMap<string, StringField>()
.ForMember(dest => dest.Value, opt => opt.MapFrom(src => src));
Mapper.CreateMap<SourceInfo, DestinationInfo>();
SourceInfo sourceInfo = new SourceInfo();
DestinationInfo destinationInfo = new DestinationInfo();
Mapper.Map(sourceInfo, destinationInfo);
// these pass
Assert.That(destinationInfo.Info1.Value, Is.EqualTo("info1"));
Assert.That(destinationInfo.Info2.Value, Is.EqualTo("info1"));
// this fails since automapper instantiated brand new StringField()
// which has Name == "".
Assert.That(destinationInfo.Info1.Name, Is.EqualTo("field name 1"));
}
}
これは予想される動作ですか?どうすれば私が望むものを達成できますか? エンティティ クラスには大量のフィールドがあるため、この回避策はうまくいきません。