2017-11-16 8 views
0

私たちは、ASP.NET Core 2.0でautomapperを使用します。Automapperのコンパイルマッピング

各マッパーから使用されるマッピング設定を一度作成するのが好きです。私たちは、automapperがスレッドセーフではないと一度読んだので、私たちは問題がないと要求ごとにマッパーを作成します。

我々は((コードMapperConfigruation.CompileMappingsに参照してください)アプリケーションの起動時にmappingconfigurationをプリコンパイルしたい。

私はマッピングにかかる​​時間の時間を測定した場合、私は最初のマッピングは、他のより多くの時間を必要としていることがわかり。マッピング私はバグを持っている理由があるのか​​、やる

コードスタートアップクラスのConfigureServiceで

:?

services.AddSingleton<MyMapperConfiguration>(); 
services.AddScoped<IObjectMapper, MyMapper>();  

Mapperconfiguration

public class MyMapperConfiguration 
    { 
     public MapperConfiguration MapperConfiguration { get; private set; } 

     public MappingDefinition MappingDefinition { get; } 

     public MapperConfiguration(IOptions<MappingDefinition> mappings) 
     { 
      // MappingDefinitions hold some information where to search mappings 
      MappingDefinition = mappings.Value; 
     } 


     public void Configure() 
     { 
      List<Type> mappingDefinitionClasses = new List<Type>(); 

      // Search Types with special attribute and add it to the typelist 

      MapperConfiguration = new MapperConfiguration(cfg => 
      { 
       cfg.AddProfiles(mappingDefinitionClasses.ToArray()); 
      });    
      MapperConfiguration.CompileMappings(); // <-- THIS SHOULD COMPILE THE MAPPING I THNIK?! 

     } 

`

マッパー

public class MyMapper : IObjectMapper 
    {  
     public IMapper Mapper { get; } 

     public Mapper(MapperConfiguration mappingConfiguration) 
     {   
      Mapper = mappingConfiguration.MapperConfiguration.CreateMapper(); 
     } 

     public TDestination Map<TSource, TDestination>(TSource source) 
     { 
      return Mapper.Map<TSource, TDestination>(source); 
     } 
    } 

IObjectMapper:スタートアップのConfigruateのMethodeのでWEBAPI

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
destObj = _mapper.Map<Source, Destination>(sourceObj); 
sw.Stop(); 
Debug.WriteLine($"Duration of mapping: {sw.ElapsedMilliseconds}"); 

内部

public interface IObjectMapper 
    {   
     TDestination Map<TSource, TDestination>(TSource source);   
    } 

測定時間Iはまた、)(マッピング設定のインスタンスを取得し、設定を呼び出しますこのインスタンスが生き残ること。

+0

AutoMapper用のASP.NETコアの拡張パッケージ(https://github.com/AutoMapper/AutoMapper.Extensions.Microsoft.DependencyInjection)を参照すると、この設定が非常に簡単になります。 –

+0

オートマトンに直接依存することは望ましくありません。マッパーの実装を交換する必要があります – Tester

+0

何ですか?どうして?それはあまり効果のない仕事のすばらしさでしょう。マッパーの実装を変更したい場合は、抽象化せず、単に正規表現を学んでください。 –

答えて

1

AMはスレッドセーフです。マッパー自体は高価ではない、あなたはそれを共有することができますかどうか。可能であれば、それを共有するほうが安いです。コンパイルマッピングが少し変わったので、最新のものにアップグレードしてください。しかしそれ以外にも、おそらくあなたが見ているのはJITコンパイラでしょう。マッピングが実行されるまで、コードはコンパイルされません。 CompileMappingsは式をILにコンパイルするだけです。 JITはILをマシンコードにコンパイルします。何が起こるかをプロファイルして検証できます。