C#プログラミング、オープンソースエンティティマッピングフレームワークの使用EmitMapper

1はじめに

エンティティを相互にマッピングするための強力なカスタマイズ可能なツール。エンティティは、純粋なオブジェクト、DataReader、SQLコマンド、および必要なものであれば何でもかまいません。このツールは、Emitライブラリを介してランタイムコードを生成します。DTOオブジェクト、データアクセス層などを処理すると便利です。

長所:高速、使いやすく、柔軟性;
短所:11年間メンテナンスなし...

Emit Mapperは、次のタイプを自動的に変換できます。

  • 文字列処理のためのToString()メソッドの使用。
  • System.Convertクラスの基本タイプを使用します。
  • null許容型は値型であり、その逆も同様です。
  • 列挙はその基礎となる型であり、その逆も同様です。
  • 文字列に列挙し、その逆も同様です。
  • さまざまなタイプのコレクション(Array、ArrayList、List <>、IEnumerable)
  • クラスから構造へ、またはその逆。
  • 複雑なネストされたメンバーを持つ複雑な型は、浅いまたは深い対応を持つ再帰的マッピングを使用します。

2.ウェブサイト

公式ウェブサイトのソースコード

3.使用する

コンソールから

PM> Install-Package EmitMapper

または:
ここに画像の説明を挿入

4.手順を使用します

デフォルトのマッピングコンフィギュレータは、次のタイプを自動的に変換できます。

  • すべての型から文字列型にToString()メソッドを使用します。
  • System.Convertクラスによって変換されたプリミティブ型を使用できます。
  • null許容型、列挙型、さまざまなコレクション型、構造体、およびクラス。
  • 複雑なネストされた型は再帰的に変換されます。
  • デフォルトの変換で要件を満たせない場合、デフォルトのマッピングコンフィギュレーターでは、命名規則、カスタムコンストラクター、カスタムコンバーター、メンバーの無視などを指定することもできます。

ここに画像の説明を挿入

4.1通常のマッピング

フィールド名は同じです

    public class UserInfo
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
    }

    public class UserInfoDTO
    {
    
            
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
    }

    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>();
    UserInfoDTO userdto = mapper.Map(user);

4.2フィールドのマッピングを無視する

    public class UserInfo
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
    }
    public class UserInfoDTO
    {
    
    
        public string id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
    }
    var user = new UserInfo {
    
     
                id = 12, 
                name = "张三", 
                address = "北京"
            };

    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                .IgnoreMembers<UserInfo, UserInfoDTO>(new string[] {
    
     "name" })
            );
    UserInfoDTO userdto = mapper.Map(user);

4.3空の要素にデフォルト値を割り当てる

    public class UserInfo
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
        public DateTime? godate {
    
     get; set; }
    }
    public class UserInfoDTO
    {
    
    
        public string id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
        public DateTime godate {
    
     get; set; }
    }
    var user = new UserInfo {
    
     
                id = 12, 
                name = "张三", 
                address = null,
                godate = null
            };

    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                //如果日期为空设置为当前时间
                .NullSubstitution<DateTime?, DateTime>((value) => DateTime.Now)
                //如果string类型为null赋值为“”
                .NullSubstitution<string, string>((value) => "")
            );
    UserInfoDTO userdto = mapper.Map(user);

4.4 2つのエンティティの名前に一貫性がなく、マッピングする必要があります

    public class UserInfo
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }
    }
    public class UserInfoDTO
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string userAddress {
    
     get; set; }
    }
    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                .MatchMembers((x, y) =>
                {
    
    
                    if (x == "address" && y == "userAddress")
                    {
    
    
                        return true;
                    }
                    return x == y;
                })
                );
    UserInfoDTO userdto = mapper.Map(user);

4.4外部キーの関連付けがあり、外部キーの名前をマッピングする必要があります

    public class UserInfo
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string address {
    
     get; set; }

        public Teacher teacher {
    
     get; set; }
    }
    public class Teacher
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
    }
    public class UserInfoDTO
    {
    
    
        public int id {
    
     get; set; }
        public string name {
    
     get; set; }
        public string teacher {
    
     get; set; }
    }

    var user = new UserInfo {
    
     
                id = 12, 
                name = "张三", 
                address = "北京",
                teacher = new Teacher {
    
     
                    id = 11, 
                    name = "王五" 
                }
            };

     var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                .ConvertUsing<Teacher, string>(t => t.name)
                );
     UserInfoDTO userdto = mapper.Map(user);

4.3複数の特別な状況が共存する

public class Sourse
{
    
    
    public int A;
    public decimal? B;
    public string C;
    public Inner D;
    public string E;
}

public class Dest
{
    
    
    public int? A;
    public decimal B;
    public DateTime C;
    public Inner2 D;
    public string F;
}

public class Inner
{
    
    
    public long D1;
    public Guid D2;
}

public class Inner2
{
    
    
    public long D12;
    public Guid D22;
}

ObjectsMapper<Sourse, Dest> mapper1 = 
    new ObjectMapperManager().GetMapper<Sourse, Dest>(
        new DefaultMapConfig()
        .IgnoreMembers<Sourse, Dest>(new string[] {
    
     "A" })
        .NullSubstitution<decimal?, decimal>((value) => -1M)
        .ConvertUsing<Inner, Inner2>(value => new Inner2 {
    
     D12 = value.D1, D22 = value.D2 })
        .PostProcess<Dest>((value, state) => {
    
     value.F = "nothing"; return value; })
        );
Dest dst = mapper1.Map(src);

参照

5.EmitMapperとTinyMapperの簡単な比較

元の記事:EmitMapperとTinyMapperの簡単な比較

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_43307934/article/details/108717276