Dot-Net

Autofac 和 Automapper 的新 API - ConfigurationStore 消失了

  • March 29, 2017

我在 .Net 應用程序中使用 Automapper 和 Autofac 已經有一段時間了。我這樣配置它們:

builder.RegisterAssemblyTypes(typeof (OneOfMyMappingProfiles).Assembly)
       .Where(t => t.IsSubclassOf(typeof (Profile)))
       .As<Profile>();

builder.Register(ctx => new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers))
       .AsImplementedInterfaces()
       .SingleInstance()
       .OnActivating(x =>
       {
           foreach (var profile in x.Context.Resolve<IEnumerable<Profile>>())
           {
               x.Instance.AddProfile(profile);
           }
       });

builder.RegisterType<MappingEngine>()
           .As<IMappingEngine>().SingleInstance();

隨著 Automapper (4.2) 的最新版本,API 發生了變化,我無法轉換為新的 API。ConfigurationStore 似乎不再存在。根據文件,向 IOC 註冊的方式現在是這樣的:

var profiles =
       from t in typeof (AutoMapperRegistry).Assembly.GetTypes()
       where typeof (Profile).IsAssignableFrom(t)
       select (Profile)Activator.CreateInstance(t);

   var config = new MapperConfiguration(cfg =>
   {
       foreach (var profile in profiles)
       {
           cfg.AddProfile(profile);
       }
   });

   For<MapperConfiguration>().Use(config);
   For<IMapper>().Use(ctx => ctx.GetInstance<MapperConfiguration>().CreateMapper(ctx.GetInstance));

但是使用的是 StructureMap。前半部分沒問題,但我不確定如何翻譯“For<>.Use()”部分。我如何在 Autofac 中做到這一點?

好的。解決了。這是替換:

var profiles =
       from t in typeof(LocationMappingProfile).Assembly.GetTypes()
       where typeof(Profile).IsAssignableFrom(t)
       select (Profile)Activator.CreateInstance(t);

       builder.Register(ctx =&gt; new MapperConfiguration(cfg =&gt;
       {
           foreach (var profile in profiles)
           {
               cfg.AddProfile(profile);
           }
       }));

       builder.Register(ctx =&gt; ctx.Resolve&lt;MapperConfiguration&gt;().CreateMapper()).As&lt;IMapper&gt;();

更新

這是配置文件的範例。超級簡單。在這種情況下,我只有一個映射。但我可以添加其他人。我試圖通過實體將它們邏輯地保持在一起。因此,在這種情況下,將來從或到 ProviderDetail 的任何映射都將在此文件中。到不同實體的映射將位於單獨的 mappingprofile 類中。配置文件類中沒有註入任何內容:

public class ProviderMappingProfile : Profile
{
   protected override void Configure()
   {
       CreateMap&lt;ProviderDetail, ProviderListItem&gt;();
   }
}

更新2

下面是一個證明映射正確的測試範例:

public class ProviderMappingProfileTests
{
   [Fact]
   public void CreateMap_ProviderDetailToProviderQueryResult_IsValid()
   {
       var config = new MapperConfiguration(cfg =&gt;
           cfg.CreateMap&lt;ProviderDetail, ProviderListItem&gt;()
           );

       config.AssertConfigurationIsValid();
   }
}

引用自:https://stackoverflow.com/questions/35187475