私は最近、AutoMapper という興味深いものを発見しました。これは、主にモデルを DTO に変換します。DTO は、ドメイン オブジェクトの動作をプレゼンテーション層に過度に公開しないように、データにさらに注意を払い、ドメイン オブジェクトを合理的にカプセル化します。
まず、2 つのクラス間のマッピングの例をいくつか見てみましょう。
まず、Source と DTOSource の 2 つのクラスを定義します。
public class Source { public int Id { get; set; } public string Content { get; set; } } public class DTOSource { public int Id { get; set; } public string Content { get; set; } }
Source フィールドと DTOSource フィールドは、AutoMapper を通じてどのように変換されるかを見てみましょう。コードは非常に簡単です。
Mapper.Initialize(x=>{ x.CreateMap<Source,DTOSource>(); }); Source s = new Source{Id=1,Content="123"}; DTOSource dto = Mapper.Map<DTOSource>(s);
最初のステップは、Source インスタンスと DTOSource の間のマッピングを確立することです。Source インスタンスを初期化した後、実行結果を確認します。
実行が完了すると、dto とこれは、2 つのクラスのフィールド名がまったく同じである場合に当てはまります。では、DTOSource のフィールド名が Source のフィールド名と異なる場合はどうなるでしょうか。実際には非常に簡単です。
を少しコードに変更するだけです。
現時点では、マッピング関係を確立するときにフィールドを指定するだけです。
1 Mapper.Initialize(x => { 2 x.CreateMap<Source, DTOSource>().ForMember(c=>c.Desc,q=> { 3 q.MapFrom(z => z.Content); 4 }); 5 });
見てみましょう 実行結果を見てみましょう
結果が前の実行結果と同じであることがわかります。
つまり、2 つのリストをマップする方法は実際には非常に簡単で、最後のステップに少し変更が必要なだけです。次のコードに示すように:
Mapper.Initialize(x => { x.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { q.MapFrom(z => z.Content); }); }); s.Add(new Source { Id = 1, Content = "123" }); var dto = Mapper.Map<List<DTOSource>>(s);
コードの最後の文を除いて、他の部分はほぼ同じであることがわかりますが、コードの最後の文でターゲットの型が List
結果は期待どおりです。
実際のプロジェクトでは、この書き方は絶対に要件を満たしません。一般に、カプセル化は、Profile を継承する新しい SourceProfile を作成するために行われます。
1 public SourceProfile() 2 { 3 base.CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { 4 q.MapFrom(z => z.Content); 5 }); 6 }
すべてのマッピング関係は、プログラム内でこのクラスに記述することができます。初期化中に一度呼び出すだけです:
1 Mapper.Initialize(x =>{ x.AddProfile<SourceProfile>(); });
ブロガーが使用している AutoMapper のバージョンは 6.1.1.0 です。AutoMapper はバージョン 6.0 で Configure を削除したため、バージョン 6.0 以前の記述方法とは少し異なります。バージョン 6.0 より前のバージョンは :
public class SourceProfile : Profile { protected override void Configure() { CreateMap<Source, DTOSource>().ForMember(c => c.Desc, q => { q.MapFrom(z => z.Content); }); } }
Profile を継承してその Configure を書き換えるだけで、呼び出し方法は上記とあまり変わりません。 Mapper.Initialize には 1 つ以上のプロファイルを追加できます。
MVC プロジェクトのアプリケーションでは、Mapper.Initialize をクラスにカプセル化できます
public static class AutoMapperForMvc { public static void Register() { Mapper.Initialize(x => { x.AddProfile<SourceProfile>(); }); } }
次に、それを MVC Global に一度登録します。
以上がC# での AutoMapper アプリケーションの例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。