4

私のプロジェクト クラス ライブラリ (dll) で automapper を使用する方法について少し苦労しています。以下の全体的なソリューションの構造を参照してください。

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

1 に答える 1

10

これを行う 1 つの方法は、リフレクションを使用してすべてのプロファイルをロードすることです。

        var assembliesToScan = 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);
            }
        });

1 つの Automapper プロファイルを直接参照するのではなく、現在の AppDomain からすべてのプロファイルをロードするだけです。

于 2016-07-25T15:41:17.727 に答える