2

AutoMapper を使用して DTO からドメインにマップしようとしています。

私のDTOは次のようになります。

public class MyDTO
{
    public string Name { get; set; }
    public bool OtherProperty { get; set; }

    public ChildDTO[] Children { get; set;}
}

public class ChildDTO
{
    public string OtherName { get; set; }
}

私のドメイン オブジェクトは次のようになります。

public class MyDomain
{
    public string Name { get; set; }
    public bool OtherProperty { get; set; }
    public ISet<ChildDomain> Children { get; set; }
}

public class ChildDomain
{
    public string OtherName { get; set; }
}

これらの配列からセットにマップできるように AutoMapper をセットアップするにはどうすればよいでしょうか。AutoMapper が配列を取り、それらを IList に変換してから、ISet への変換に失敗しているようです。

ここに例外があります

Unable to cast object of type 'System.Collections.Generic.List`1[DataTranser.ChildDTO]' to type 'Iesi.Collections.Generic.ISet`1[Domain.ChildDomain]'.

DTOからドメインへのマッピングに必要なインフラストラクチャを最小限に抑えることができるように、これを行うための簡単で一般的な方法を見つけたいと思っています。どんな助けでも大歓迎です。



更新:
では、貧血ドメイン モデルで終わることなく MyDomain -> ChildDomain をモデル化するにはどうすればよいでしょうか? MyDomain または ChildDomain にビジネス ロジックがないと、ドメイン モデルが現在貧弱であることは理解していますが、前進するにつれてビジネス ロジックを追加することが目標でした。ビュー モデルをドメイン モデルに変換して永続化できるようにしたいだけです。

ビューとドメインの間の単純なマッピングから移行し、後でビジネス ルールを追加する場合、このシナリオに対して何を提案しますか?

ご協力いただきありがとうございます。

4

2 に答える 2

4

永続層が単純な場合、UseDestinationValue()を使用すると、AutoMapperに基になるコレクションを置き換えないように指示されます。

ForMember(dest => dest.Children、opt => opt.UseDestinationValue())

ただし、それが単純でない場合は、手動で更新してドメインに戻します。ドメインモデルを更新するには、通常、ロジックがより複雑になります。逆マッピングを行うと、ドメインモデルの形状に制約が課せられますが、これは望ましくない場合があります。

于 2009-11-10T14:57:08.400 に答える
1

答え:

  1. ISet のようなカスタム コレクションをマップするには、独自の IObjectMapper を作成する必要があります。
  2. すべての標準 objectmapper と新しい setobjectmapper を使用して、独自の構成インスタンスを作成します。
  3. 静的な AutoMapper.Mapper クラスの代わりに、独自の objectmapper を使用して構成で作成された IMappingEngine インスタンスを使用します。

いくつかのコメント:

  • コントロール コンテナーの反転で IMappingEngine 構造を構成するのは簡単です。
  • automapper 自体のソースは、IObjectMapper 実装の作成に役立つ場合があります。
  • オートマッパーの設計目的とは逆の方法で使用しています。複雑なオブジェクトを単純なオブジェクトにマップするように設計されています。単純な DTO を複雑なエンティティにマップしようとしています。(これは、オートマッパーでやりたいことが難しいという意味ではありませんが、将来別の問題が発生する可能性があります)
  • 貧血ドメイン モデル アンチ パターンを使用しています。ドメインはすべてのビジネス ロジックを保持する必要があるため、ISet のような複雑なコレクションを公開しないでください (コレクションのパブリック セッターは一切公開しないでください)。
于 2009-11-09T20:36:53.713 に答える