0
AutoMapperマッピングエンジン用の汎用ラッパーを作成します。私の最終的な目標は、インターフェイスに結びつけることです。AutoMapper:マッピングエンジンの汎用ラッパーを作成します。
public interface IMappingEngine
{
TDestination Map<TSource, TDestination>(TSource source);
}
私はDIで解決します。
次に、AutoMapper MappingEngine
に基づいてこのインターフェイスの実装を作成します。
public class AutoMapperMappingEngine : IMappingEngine
{
private readonly ConfigurationStore configurationStore;
private readonly MappingEngine mappingEngine;
public AutoMapperMappingEngine()
{
this.configurationStore = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
this.RegisterMappings();
this.configurationStore.AssertConfigurationIsValid();
this.mappingEngine = new MappingEngine(this.configurationStore);
}
/// <summary>
/// This method registers alternate mappings for already existing mappings.
/// </summary>
private void RegisterMappings()
{
// some code
// this.configurationStore.CreateMap<>
}
public TDestination Map<TSource, TDestination>(TSource source)
{
TDestination mappingResult = this.mappingEngine.Map<TDestination>(source);
return mappingResult;
}
}
しかし、私は問題を抱えていました。同じ種類のペアに対して2つ以上の異なるマッピングが必要な場合はどうなりますか?私はRegisterMappings
の内側に順に、いくつかの異なるマッピングを登録した場合
IMappingEngine autoMapperMappingEngine;
// Initialize autoMapperMappingEngine
FooModel result;
if(firstCondition)
{
result = autoMapperMappingEngine.Map<FooEntity, FooModel>(entity);
}
else
{
if(secondCondition)
{
result = autoMapperMappingEngine.Map<FooEntity, FooModel>(entity);
}
else
{
result = autoMapperMappingEngine.Map<FooEntity, FooModel>(entity);
}
}
最後のマッピングは、残りの部分をオーバーラップします。私が望むものを実装する方法をアドバイスしてもらえますか?
を拡張する必要がありますが、コンフィギュレーションを作成し、マッピングするためにそれを使用することを含みます私が付いている問題の簡単な例。私の一般的なプロジェクトには多くのレイヤーがあります。各レイヤーで、私のマッピングを登録するために 'Mapper.CreateMap <>'メソッドを使います。別のマッピングが必要な場合には、特別な場合には 'MappingEngine'を使う必要があります。 –
@JosephKatzmanごめんなさい、何を意味するのか分かりません。構成インスタンスを使用することは確かにすべての要件を満たす必要があります。なぜこれが機能しないのか説明してください。どのような特別な場合ですか?異なるマッピングを持つ複数の構成を持つことによって、それらがカバーされないのはなぜですか? – Milney
私は大きなプロジェクトを持っています。静的 'Mapper.CreateMap <>'に依存するコードの部分を書き換えることはできません。だから私は 'MappingEngine'を使用しています。上記のインターフェースを使ってプロジェクトを書き直すべきだと私は知っています。それを書き換えることは不可能であると仮定しよう。それは私のための挑戦です;)私は欲しいものを実装する別の方法がありますか? –