ホームページ > バックエンド開発 > C#.Net チュートリアル > AutoMapper を使用して Dto と Model 間の自由な変換を実現します (中央)

AutoMapper を使用して Dto と Model 間の自由な変換を実現します (中央)

巴扎黑
リリース: 2016-12-20 11:30:28
オリジナル
1992 人が閲覧しました

注: この一連の記事のコードはここからダウンロードできます。

前の記事では、モデル、Dto、およびそれらの間の変換ルールを含む完全なアプリケーション シナリオを構築しました。これで、腕まくりをして AutoMapper の旅を始めることができます。
[2] コンベンション モードでゼロ構成オブジェクト マッピングを実装します。
AddressDto 構造と Address 構造はまったく同じであり、フィールド名もまったく同じです。このような型変換のために、AutoMapper は公式 Web サイトで次のようにコンベンションを提供します。 AutoMapper にマッピングする 2 つの型を指示します (Mapper クラスの静的メソッド CreateMap を呼び出し、マッピングする型を渡します):

C# コード

Mapper.CreateMap();

その後は AutoMapper にすべてやってもらいましょう:

C# コード

AddressDto dto = 新しい住所 Dto

{


Country = "中国",

City = "Beijing",

Street = "Dongzhimen" Street",

PostCode = "100001"

};

Address address = Mapper.Map(Dto);

address. Country.ShouldEqual("China");

address .City. ShouldEqual(" 北京");

address.Street.ShouldEqual("Dongzhimen Street");

AddressDto に空の値を持つ属性がある場合、対応するアドレスのプロパティを空にするように設定します:

C#コード

アドレスアドレス= mapper.map< addressdto、addressdto>(new addressdto

city.shouldbenull(); ;

address.PostCode.ShouldBeNull();



空の AddressDto が渡された場合でも、AutoMapper は空の Address オブジェクトを取得するのに役立ちます。

C# コード

Address address = Mapper.Map(null);

address.ShouldBeNull();

この規則マッピング メソッドを「おもちゃ」として扱わないでください。同じフィールド名を持つ複合型をマッピングする場合には、依然として非常に強力です。

たとえば、BookStoreDto から BookStore へのマッピングを考えてみましょう。両方のフィールド名はまったく同じですが、フィールド タイプは一貫していません。 BookDto から Book へのマッピング ルールに加えて、Convention モードで AddressDto から Address へのマッピングを定義した場合、「ゼロ構成」を使用して BookStoreDto から BookStore へのマッピングを実装できます:

C# コード

IMappingExpressionexpression = Mapper.CreateMap();

// BookDto から Book へのマッピング ルールを定義します

Mapper.CreateMap(); BookStore> ;();

次に、BookStoreDto を直接変換できます:

C# コード

BookStoreDto = new BookStoreDto

名前 = 「My Store」、

住所 = 新しいアドレスDto

{

市 = 「北京」

}、

書籍 = 新しい リスト  

{

新しい BookDto {Title = 「RESTful Web Service」 "}、

新しい BookDto {タイトル = 「Ruby for Rails」}、

}

};  

BookStore bookStore = Mapper.Map(dto);  

bookStore.Name.ShouldEqual("私のストア");  

bookStore.Address.City.ShouldEqual("北京");  

bookStore.Books.Count.ShouldEqual(2);  

bookStore.Books.First().Title.ShouldEqual("RESTful Web Service");  

bookStore.Books.Last().Title.ShouldEqual("Ruby for Rails");  


【三】規定の種類の唯一の映写方法
前に私たちは従来の映写方式を認識しましたが、顧客の意見も非常に多くの種類の映写方式で行われており、この時点で私たちが使用する必要があります私の構成は「タイプ」の形式で書かれており、よく使われる xml 形式よりも優れています。一下前文中定義的规舙:BookDto.Publisher -> Publisher.Name 。  

map.ForMember(d => d.Name, opt => opt.MapFrom(s => s.Publisher));  

AutoMapper は、ForMember を使用して、各フィールドを指定します。

参照

各カスタム メンバー構成は、アクション デリゲートを使用して各メンバーを構成します。

さらに、ConstructUsing 方式を使用して、すべてのフィールドのマッピングを直接指定することもできます。たとえば、BookD を最初の作成者 (著者) の連絡先情報に指定する場合、ConstructUsing 方式を使用すると、次のことが可能になります。
C#代码

var map = Mapper.CreateMap();  

map.ConstructUsing(s => new ContactInfo

ブログ = s.FirstAuthorBlog,おなじみの方法で使用します:

C# code

BookDto dto = new BookDto

uthorEmail = "matt .rogen@abc.com」、


}; tContactinfo contactinfo = bookdto、contaltinfo & gt;幸いなことに、AutoMapper が提供する規約または構成メソッドは「XOR」ではありません。この 2 つのメソッドを組み合わせて使用​​すると、同じ名前のフィールドの構成を無視して、異なる名前のフィールドのマッピング ルールを構成できます。
たとえば、前述の AddressDto から Address へのマッピングの場合、AddressDto の Country フィールドが Country ではなく CountryName と呼ばれる場合、AddressDto から Address へのマッピング ルールを記述するときに必要なのは次のとおりです:

C# コード

var map = Mapper.CreateMap();

map.ForMember(d => d. Country, opt => opt.MapFrom(s => s. CountryName));市区町村、番地、郵便番号の場合、ルールを定義する必要はありません。AutoMapper は正しいマッピングの実行に役立ちます。

関連ラベル:
c#
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート