2016-07-24 9 views
1

プロジェクトクラスライブラリ(dll)でautomapperを使用する方法について少し苦労しています。下の私の全体的なソリューションの私の構造を見てください。ASP.Net webappの参照プロジェクトDLLでAutoMapperプロファイルを初期化する方法

WebAppが起動し、Global.asax App Startでは、AutoMapper.Configure()メソッドが呼び出されてマッピングプロファイルが追加されます。今のところは、Services.AutoMapperViewModelProfileを追加するだけです。しかし、WebStoreAdapterのそれぞれのプロファイルをどうにかして説明する必要があります(以下の例のBigCommerceとShopify)。 AutoMapperConfig中にプロファイルを追加できるように、WebAppの各WebStoreAdapterへの参照を追加しないことを望んでいました。 WebStoreFactoryのAutoMapper.Initializeへの別の呼び出しを追加すると、WebAppのAutoMapper.Initializeを上書きします。

私は他のやり方でここに欠けているか完全に根元から外れている別の方法がありますか?

のGlobal.asaxから呼び出されて初期化
WebApp 
    - AutoMapperConfig 
     - AddProfile Services.AutoMapperViewModelProfile 

    Services.dll   
     - AutoMapperViewModelProfile 

    Scheduler.dll (uses HangFire to execute cron jobs to get data from shop carts. Its UI is accessed via the WebApp) 

     WebStoreAdapter.dll 
      -WebStoreFactory 

       BigCommerceAdapter.dll 
        - AutoMapperBigCommerceDTOProfile 

       ShopifyAdapter.dll 
        - AutoMapperShopifyDTOProfile 

public static class AutoMapperConfiguration 
{ 
    public static void Configure() 
    { 
     Mapper.Initialize(am => 
     { 
      am.AddProfile<AutoMapperViewModelProfile>(); 
     }); 
    }  
} 

プロフィール:これを行うには

public class AutoMapperViewModelProfile : Profile 
{ 
    public override string ProfileName 
    { 
     get { return this.GetType().ToString(); } 
    } 

    protected override void Configure() 
    { 
     CreateMap<InventoryContainerHeader, InventoryContainerLabelPrintZPLViewModel>() 
       .ForMember(vm => vm.StatusDescription, opt => opt.MapFrom(entity => entity.InventoryContainerStatus.DisplayText)) 
       .ForMember(dest => dest.ContainerDetails, option => option.Ignore()) 
       ; 
     ... 
    } 
} 

答えて

4

一つの方法は、すべてのプロファイルをロードするためにリフレクションを使用することです:

 var assembliesToScane = AppDomain.CurrentDomain.GetAssemblies(); 
     var allTypes = assembliesToScan.SelectMany(a => a.ExportedTypes).ToArray(); 

     var profiles = 
      allTypes 
       .Where(t => typeof(Profile).GetTypeInfo().IsAssignableFrom(t.GetTypeInfo())) 
       .Where(t => !t.GetTypeInfo().IsAbstract); 

     Mapper.Initialize(cfg => 
     { 
      foreach (var profile in profiles) 
      { 
       cfg.AddProfile(profile); 
      } 
     }); 

あなたは直接参照していませんいずれかのプロファイルを適用しますが、すべてのプロファイルを現在のAppDomainからロードするだけです。

関連する問題