Open1
AutoMapperについて
オニオンアーキテクチャなどを使用している際に、レイヤーを跨いでデータを受け渡しする際にデータの詰め替えが発生する
例:
・DataModel(EFCoreで使用している型)→DomainModel
など
上記のような、値の詰め替えを手で書くのが面倒なので、AutoMapperについて調べてみる。
また、想定しているのはASP.Net Core Web API(.NET 6以上)。
公式
基本
- 変換元(以下、src)と変換先(以下、dest)のプロパティ名を利用して一定のルールに従って、オブジェクトの詰め替えをしてくれる
- 例:どちらにも「FirstName」というプロパティがあれば、詰め替えしてくれる
使用方法
初期化
- DIでAutoMapperを使用する各クラスに変換するオブジェクトを渡す
マッピングの設定定義
- Profileを作成してそこに記載する
- 量が増える場合、またぐレイヤーごとなどでProfileを切ってもよさそう?Profile一つで中で分けてもいいし、ProfileのFactory作ってもよかったりする?
変換のテスト方法
- 実際に変換しているソースコードではなく構成のテストが必要
- https://docs.automapper.org/en/stable/Configuration-validation.html
- デフォルトではdestを使用してメンバーがすべてマッピングされているかを検証する
- 動作を変えたい場合は、変更可能
使用が多そうなカスタム
気にしないといけないところ
-
デフォルトでは名前から詰め替えなので、srcとdestの命名規則が異なりすぎるとカスタムルールや命名規則を変えないといけないことが多くなって面倒(それでも1回だけかもしれないが)
- 例
- Presentation<->ApplicationService
- PresentationはJson、AppliocationServiceはDomainの場合に命名規則が異なることがありそう
- Domain<->Infra(EFCoreのデータ型など)
- DBのカラム名など命名規則が異なる場合にカスタムルールが必要そう
- Presentation<->ApplicationService
- 例
-
コレクション型
- デフォルトでサポートされているコレクションであれば、要素の型だけ構成すればOK
- https://docs.automapper.org/en/stable/Lists-and-arrays.html
- ただし、コレクションの新規作成ではなくすでに作成されているコレクションに割り当てする場合は、AutoMapperの別のモジュールが必要そう
- https://github.com/AutoMapper/AutoMapper.Collection
- srcがnullの場合、destは空の配列になる
- 設定で変更できる。グローバル、プロファイル、メンバーで指定できて上書きできる
- https://docs.automapper.org/en/stable/Lists-and-arrays.html#handling-null-collections
- コレクション内に多態性(継承関係)がある場合は、明示的に指定することで変換が可能
-
変換するときにコンストラクタを使いたい
- デフォルトでコンストラクターを使ってくれるが、コンストラクターのパラメーター名を合わせておかないといけない
- 合わせられないときは、設定でマッピングできる
- 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);