2017-08-15 20 views
0

私のビューモデルの大半は、EncryptedBaseViewModelというベースビューモデルから継承しています。このメソッドはIDを暗号化して、データベースの機密情報が表示されないようにします。特定のクラスからすべて継承する汎用オートマッパーマッピング

EncryptedBaseViewModelにマップされているエンティティ間のすべてのマッピングを処理するAutoMapperマッピングを作成したいとします。ソースIDの値を取得し、宛先のSetIdメソッドに渡します。


のViewModelクラス

class EncryptedBaseViewModel 
{ 
    private string _encryptedId; 
    public int Id {get; set; } // to be after new mapping method is developed. 

    public void SetId(int id) 
    { 
     _encryptedId = Encrypted(id); 
    } 

    public string GetId() 
    { 
     return _encryptedId; 
    } 
} 

自動マッパー例

私ははアプローチのかわからないとしてマッピング後の値を渡すこの例を、ハッキング を築いてきました。 こちらをお奨めします。

CreateMap<AnySource, EncryptedBaseViewModel>().ForMember(vm => nameof(vm.Id), opt => opt.Ignore()).AfterMap((src,dest) => dest.SetId(src.Id)); 

質問

  1. は、一般的なマッパーを作ってそれは可能です。もしそうなら、AnySourceがどこに指定されますか?
  2. マッピングは他の特定のマッピングと同様に実行されますか? - したいです。

私はすべてのエンティティに対して同じマッピングを書く必要がないようにしています。これは、実行が忘れられる状況につながる可能性があるためです。

+2

目的地にマップしたいクラスを特定のインターフェースを実装してマッピングするほうがよいでしょう。 – DavidG

答えて

1

@DavidGによると、あなたのソースには基本クラスまたはインターフェイスが必要です。オブジェクトからマップすることもできますが、ソースIDに何らかの形でアクセスする必要があるため、それはあまり有用ではありません。なぜAfterMap?それはハックです。レゾルバインラインまたはレゾルバクラスを書くことができます。 2つ目のポイントについては、両方のマッピングを実行する(ベースと派生)場合はIncludeが必要です。 docs

関連する問題