2017-12-08 4 views
0

オートマッパーは、実行時パラメータに基づいてコレクションから単一インスタンスにマップできるように構成できますか?リストをランタイムパラメータのあるフィールドに減らす

私たちのアプリケーションでは、エンティティには各言語のラベルが付いています。 現在のユーザーの設定に応じて、単一の値を表示する必要があります。私は私が私のエンティティをマップするとき、それはDepartmentViewModelにDepartmentEntityからマップすることができますので、私はAutomapperを設定することができ、現在のユーザーの文化を知って考える

DepartmentEntity 
    Labels: Label[] 
    Value: string 
    Culture: CultureInfo 

DepartmentViewModel 
    Label: string 

this oneよう

何か

var department = Mapper.Map<DepartmentEntity, DepartmentViewModel>(user.Culture); 

のような他の回答には、まっすぐに目標値として使用するためのパラメータを渡すように見えます。 リストを1つのフィールドに減らす方法として、これを使用したいと思います。

答えて

3

は、あなたはそれをあなたが言及した答えと同じ操作を行うことができます。

var department = Mapper.Map<DepartmentEntity, DepartmentViewModel>(departmentEntity, 
    opt => opt.AfterMap((src, dest) => dest.Label = src.Labels.FirstOrDefault(x=> 
             x.CultureInfo.Name == user.Culture.Name)?.Value)); 

あなたがマップを定義するときignoreコールをしなければならない点に注意してください。

UPDATE

あなたが正しいといくつかのより多くの研究の後に、それが実際に可能とAutomapperでこれを達成するために、かなり簡単です。このSO answerから入手した機能です。

cfg.CreateMap<DepartmentEntity, DepartmentViewModel>().ForMember(x => x.Label, opt => 
opt.ResolveUsing((src, dest, member, context) => 
        src.Labels.FirstOrDefault(x=> x.Culture.Name == 
          context.Items["userCulture"].ToString())?.Value)); 

のとき変換オブジェクトが

var userCulture = new CultureInfo("en-US"); 
var department = Mapper.Map<DepartmentViewModel>(depEntity, 
      opt => opt.Items["userCulture"] = userCulture.Name); 
+0

を使用しますが(好ましくは規則による)一箇所に一度マッピング・ロジックを定義することができるようにautomapperが存在する全体の理由ではないですか? 2番目のコード行でソースとデスティネーションオブジェクトを使用するだけで、後のマップの利点は何ですか? –

関連する問題