Dot-Net
Autofac 和 Automapper 的新 API - ConfigurationStore 消失了
我在 .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 => new MapperConfiguration(cfg => { foreach (var profile in profiles) { cfg.AddProfile(profile); } })); builder.Register(ctx => ctx.Resolve<MapperConfiguration>().CreateMapper()).As<IMapper>();更新
這是配置文件的範例。超級簡單。在這種情況下,我只有一個映射。但我可以添加其他人。我試圖通過實體將它們邏輯地保持在一起。因此,在這種情況下,將來從或到 ProviderDetail 的任何映射都將在此文件中。到不同實體的映射將位於單獨的 mappingprofile 類中。配置文件類中沒有註入任何內容:
public class ProviderMappingProfile : Profile { protected override void Configure() { CreateMap<ProviderDetail, ProviderListItem>(); } }更新2
下面是一個證明映射正確的測試範例:
public class ProviderMappingProfileTests { [Fact] public void CreateMap_ProviderDetailToProviderQueryResult_IsValid() { var config = new MapperConfiguration(cfg => cfg.CreateMap<ProviderDetail, ProviderListItem>() ); config.AssertConfigurationIsValid(); } }