Open1

AutoMapperについて

yhigoyhigo

オニオンアーキテクチャなどを使用している際に、レイヤーを跨いでデータを受け渡しする際にデータの詰め替えが発生する

例:
・DataModel(EFCoreで使用している型)→DomainModel
など

上記のような、値の詰め替えを手で書くのが面倒なので、AutoMapperについて調べてみる。
また、想定しているのはASP.Net Core Web API(.NET 6以上)。

公式

https://docs.automapper.org/en/stable/index.html

基本

  • 変換元(以下、src)と変換先(以下、dest)のプロパティ名を利用して一定のルールに従って、オブジェクトの詰め替えをしてくれる
    • 例:どちらにも「FirstName」というプロパティがあれば、詰め替えしてくれる

使用方法

初期化

マッピングの設定定義

  • Profileを作成してそこに記載する
  • 量が増える場合、またぐレイヤーごとなどでProfileを切ってもよさそう?Profile一つで中で分けてもいいし、ProfileのFactory作ってもよかったりする?

変換のテスト方法

使用が多そうなカスタム

気にしないといけないところ

  • デフォルトでは名前から詰め替えなので、srcとdestの命名規則が異なりすぎるとカスタムルールや命名規則を変えないといけないことが多くなって面倒(それでも1回だけかもしれないが)

      • Presentation<->ApplicationService
        • PresentationはJson、AppliocationServiceはDomainの場合に命名規則が異なることがありそう
      • Domain<->Infra(EFCoreのデータ型など)
        • DBのカラム名など命名規則が異なる場合にカスタムルールが必要そう
  • コレクション型

  • 変換するときにコンストラクタを使いたい

    • デフォルトでコンストラクターを使ってくれるが、コンストラクターのパラメーター名を合わせておかないといけない
    • 合わせられないときは、設定でマッピングできる
    • https://docs.automapper.org/en/stable/Construction.html#construction
    • どのアクセスレベルのコンストラクターのみ使用するか設定できる
    • recordを使う場合下記のようにPublicのみ指定にする必要がある
// use only public constructors
var configuration = new MapperConfiguration(cfg => cfg.ShouldUseConstructor = constructor => constructor.IsPublic);