2016-07-01 10 views
1

API検索メソッドから検索結果が返されましたが、応答内容の長さをできるだけ短くしたいと思います。AutoMapperは外部値に基づいてプロパティを条件付きでマップします

私もAutoMapperをセットアップしました。それ自体は、プロファイルに設定されたさまざまなマッピングでうまく動作しています。

検索結果のプロパティの1つがかなり重い場合があり、必ずしも必要とされないため、そのデータを含める必要はありません。だから私はこのプロパティを含めるフラグを追加した検索条件に。

この他の外部要因に基づいてプロパティを条件付きでマップする方法はありますか?

現時点では、地図の設定で重みのあるプロパティを無視するように指示してから、条件で指定した場合は、別のコレクションをマッピングして検索結果に割り当てます。

コード内

this.CreateMap<myModel, myDto>() 
    .ForMember((dto) => dto.BigCollection, 
       (opt) => opt.Ignore()) 

、次いで:マッピングプロファイルにあなたがAutomapper 5.0を使用している場合

results.MyDtos = myModels.Select((m) => Mapper.Map<myDto>(m)); 
if (searchCriteria.IncludeBigCollection) 
{ 
    foreach(MyDto myDto in results.MyDtos) 
    { 
     // Map the weighty property from the appropriate model. 
     myDto.BigCollection = ... 
    } 
} 
+0

"外的要因"とはどのスコープを意味するのですか?何かグローバル(設定ファイルのもの)?または 'Map'メソッドで渡すメソッドスコープのものです。 – MaKCbIMKo

+0

メソッドスコープから、検索基準オブジェクトのメソッドに渡されます。 –

答えて

1

次に、マッパー自体にメソッド範囲から値を渡すIMappingOperationOptionsIValueResolverを使用することができ。ここで

は一例です:

あなたの価値リゾルバ:

class YourValueResolver : IValueResolver<YourSourceType, YourBigCollectionType> 
{ 
    public YourBigCollectionType Resolve(YourSourceType source, YourBigCollectionType destination, ResolutionContext context) 
    { 
     // here you need your check 
     if((bool)context.Items["IncludeBigCollection"]) 
     { 
      // then perform your mapping 
      return mappedCollection; 
     } 
     // else return default or empty 
     return default(YourBigCollectionType); 
    } 
} 

あなたのマッピングを設定します。

new MapperConfiguration(cfg => 
{ 
    cfg.CreateMap<YourSourceType, YourDestinationType>().ForMember(d => d.YourBigCollection, opt => opt.ResolveUsing<YourValueResolver>()); 
}); 

そしてあなたのようMapメソッドを呼び出すことができます。

mapper.Map<YourDestinationType>(yourSourceObj, opt.Items.Add("IncludeBigCollection", IncludeBigCollectionValue)); 

は、値リゾルバに渡され、そこに書き込んだ内容に従って使用されます。

関連する問題