2016-07-24 5 views
1

Немного о том, как использовать automapper в моих библиотеках классов проектов (dll). См. Мою структуру моего общего решения ниже.Как инициализировать профили AutoMapper в связанных DLL-проектах проекта в ASP.Net webapp

WebApp запускается, и в приложении запуска Global.asax запускается метод AutoMapper.Configure() для добавления профилей сопоставления. На данный момент я просто добавляю Service.AutoMapperViewModelProfile. Но мне нужно как-то учитывать профили в каждом из WebStoreAdapters (BigCommerce и Shopify в приведенном ниже примере). Я надеялся не добавлять ссылки на каждый WebStoreAdapter в WebApp, просто ради того, чтобы добавлять профили во время AutoMapperConfig. Если я добавлю еще один вызов AutoMapper.Initialize в WebStoreFactory, он переопределяет значение в WebApp.

Есть ли другой способ, по которому я отсутствую или полностью покидаю базу здесь каким-то другим способом?

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 

Инициализация, как вызывается из Global.asax:

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); 
      } 
     }); 

Вы напрямую не ссылаетесь ence any one profile, но просто загрузите весь профиль из текущего AppDomain.