Automapper自動マッピングを実現するコード例


セキュリティ上、バックグラウンドでフロントとデータ転送を行う場合、本体モデルを直接転送せずにDto(Data transfer objectデータ転送オブジェクト)を使用することが多いので、バックグラウンドでデータをフロントに転送する際には不要な情報を省略し、必要な情報だけを残して、データの安全性を大いに高めることができる。
以下に二つの対応する関係モデルUser、UserDtoを示します。

public class User
{
  private const int NameMaxLength = 20;
  private const int PassWordMaxLength = 16;
  [Key]
  public long Id { get; }
  [MaxLength(NameMaxLength)]
  public string Name { get; set; }
  [MaxLength(PassWordMaxLength)]
  [DataType(DataType.Password)]
  public string PassWord { get; set; }
}
public class UserDto
{
  private const int NameMaxLength = 20;
  private const int PassWordMaxLength = 16;
  [MaxLength(NameMaxLength)]
  public string Name { get; set; }
  [MaxLength(PassWordMaxLength)]
  public string PassWord { get; set; }
}
ここでは、Idを自己成長キーと定義し、登録ページでは、このIdは見えないはずです。この時Dtoを使うメリットが現れます。この時、データベースを預け入れる時はUserDtoからUserへのタイプ転換に関わります。前の経験によって、必ず次のように書くことができます。

user.Name=userDto.Name;
user.PassWord=UserDto.PassWord;
このような変換はもちろん可能ですが、もし一つのUserオブジェクトが十分に複雑であれば、十数個から二十数個の属性を持っています。
この時、私たちはAutoMapperを通じてUserDtoからUserへの変換を完了してくれます。
まずNugetパッケージをインストールします
Tools-Nuget Package-Package Manage Cosolieに入力します。

Install-Package AutoMapper 
対応するNugetパッケージをインストールします。
Githubで与えられたヘルプドキュメントからは、2つの方法がマッピングを作成することができ、1つは静的なInitalizeであり、1つは動的な作成である。
以下は二つの異なる方法を使ってセルテストを行います。

public void Using_Initlalize_Test()
  {
    UserDto dto = new UserDto
    {
      Name = "Niko",
      PassWord = "1234",
    };
    Mapper.Initialize(ctx => ctx.CreateMap<UserDto, User>());
    User user = Mapper.Map<UserDto, User>(dto);
    user.Name.ShouldBe("Niko");
    user.PassWord.ShouldBe("1234");
    user.Id.ToString().ShouldBe("0");
  }
  public void Using_MapperConfiguration_Test()
  {
    var config = new MapperConfiguration(ctx => ctx.CreateMap<UserDto, User>());
    var mapper = config.CreateMapper();
    // var mapper = new Mapper(config);
    UserDto dto = new UserDto
    {
      Name = "Niko",
      PassWord = "1234",
    };
    User user = mapper.Map<User>(dto);
    //User user = Mapper.Map<User>(dto);
    user.Name.ShouldBe("Niko");
    user.PassWord.ShouldBe("1234");
    user.Id.ToString().ShouldBe("0");
  }
ここでShuldryまで使って枠を言い切って、具体的な使い方は公式文書を参考にします。
ルールを書き終わったら、いつもAsertConfigrationIsValid方法を呼び出して、ルールが完全かどうかを確認します。 

  Mapper.AssertConfigurationIsValid();
二つの方法はユニットテストに合格しました。このように、Automapperによって複雑なオブジェクトマッピングを処理すると、コード量が大幅に簡略化されます。
AutoMapperをより便利に使用するために、AutoMapperを拡張します。

public static class AutoMapperExtension
{
  /// <summary>
  ///      
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static T MapTo<T>(this object obj)
  {
    if (obj == null) return default(T);
    Mapper.Initialize(ctx=>ctx.CreateMap(obj.GetType(),typeof(T)));
    return Mapper.Map<T>(obj);
  }
  /// <summary>
  ///      
  /// </summary>
  /// <typeparam name="T"></typeparam>
  /// <param name="obj"></param>
  /// <returns></returns>
  public static List<T> MapTo<T>(this IEnumerable obj )
  {
    if (obj == null) throw new ArgumentNullException();
    Mapper.Initialize(ctx => ctx.CreateMap ( obj.GetType(), typeof(T))) ;
    return Mapper.Map<List<T>>(obj);
  }
}
上の方法でユニットテストを行います。

 public void testme()
  {
    UserDto dto = new UserDto
    {
      Name = "Niko",
      PassWord = "1234",
    };
    User user=dto.MapTo<User>();
    user.Name.ShouldBe("Niko");
    user.PassWord.ShouldBe("1234");
    user.Id.ToString().ShouldBe("0");
  }
締め括りをつける
以上は小编でご绍介したAutomapperの自动的なマッピングを実现するコードの実例です。皆さんに何かお聞きしたいことがあれば、メッセージをください。小编はすぐにご返事します。ここでも私たちのサイトを応援してくれてありがとうございます。