2015-03-16 1 views
2

Я использую следующий метод, как описано в следующем ответе, чтобы создать экземпляр преобразователя:Использование AutoMapper.Profile для создания экземпляра (не статический) преобразователь

, как описано на следующий вопрос:

AutoMapper How To Map Object A To Object B Differently Depending On Context.

Как я могу использовать [повторное использование] класс Automapper profile для создания экземпляра устройства отображения?

public class ApiTestClassToTestClassMappingProfile : Profile 
{ 
    protected override void Configure() 
    { 
     base.Configure(); 
     Mapper.CreateMap<ApiTestClass, TestClass>() 
      .IgnoreAllNonExisting(); 
    } 
} 

Просто чтобы дать вам представление о том, почему я требую такой функциональности: я зарегистрировать все Automapper профильных классов в мой IoC контейнер [CastleWindsor], используя следующий метод:

IoC.WindsorContainer.Register(Types.FromThisAssembly() 
             .BasedOn<Profile>() 
             .WithServiceBase() 
             .Configure(c => c.LifeStyle.Is(LifestyleType.Singleton))); 

    var profiles = IoC.WindsorContainer.ResolveAll<Profile>(); 

    foreach (var profile in profiles) 
    { 
     Mapper.AddProfile(profile); 
    } 

    IoC.WindsorContainer.Register(Component.For<IMappingEngine>().Instance(Mapper.Engine)); 

Хотя выше полностью выполняет необходимость инициализации моего статического класса Mapper, я действительно не знаю, как повторно использовать классы профилей Automapper для создания экземпляров mappers [используя нестатический mapper].

ответ

5

Вы должен убедиться, что ваш профиль вызывает правильный вызов CreateMap:

public class ApiTestClassToTestClassMappingProfile : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ApiTestClass, TestClass>() 
      .IgnoreAllNonExisting(); 
    } 
} 

CreateMap на ассоциатах класса базового профиля, отображающие с этим профилем и конфигурацией.

Кроме того, ваш IgnoreAllNonExisting должен быть заменен параметром MemberList.Source в вызове CreateMap. Это говорит: «Используйте тип источника как мой список членов для проверки вместо типа назначения».

+0

Не могли бы вы прокомментировать мой существующего решения и потенциальной возможности для улучшения и снижения производительности. – MHOOS

+0

Я понятия не имею. Я просто знаю, что ваши оригинальные профили не позволят им быть изолированными для экземпляра ядра сопоставления. Это то, что я отвечал. –

+1

Вместо этого я вызывал Mapper.CreateMap.CreateMap, поэтому он настраивался с использованием Singleton Mapper вместо созданного Autofac. Этот ответ помог мне. – Rn222

0

я в конечном итоге создание сопоставителя экземпляра завода следующим образом:

using AutoMapper; 
using AutoMapper.Mappers; 
using System.Collections.Generic; 

public class MapperFactory<TSource,TDestination> where TSource : new() where TDestination : new() 
{ 
    private readonly ConfigurationStore _config; 

    public MapperFactory(IEnumerable<Profile> profiles) 
    { 
     var platformSpecificRegistry = AutoMapper.Internal.PlatformAdapter.Resolve<IPlatformSpecificMapperRegistry>(); 

     platformSpecificRegistry.Initialize(); 

     _config = new AutoMapper.ConfigurationStore(new TypeMapFactory(), AutoMapper.Mappers.MapperRegistry.Mappers); 

     foreach (var profile in profiles) 
     { 
      _config.AddProfile(profile); 
     } 
    } 

    public TDestination Map(TSource sourceItem) 
    { 
     using (var mappingEngine = new MappingEngine(_config)) 
     { 
      return mappingEngine.Map<TSource, TDestination>(sourceItem); 
     }    
    } 
} 

И теперь я могу иметь код, подобный следующему в моем решении:

 var profiles = new Profile[] 
     { 
      new ApiTestClassToTestClassMappingProfile1(), 
      new ApiTestClassToTestClassMappingProfile2(), 
      new ApiTestClassToTestClassMappingProfile3() 
     }; 

     var mapper = new MapperFactory<ApiTestClass, TestClass>(profiles); 

     var mappedItem = mapper.Map(testClassInstance); 

Приведенный выше код позволяет максимально повторного использования классов профилей.

-1

Это, как вы создаете MapperConfiguration с профилями

public static class MappingProfile 
{ 
    public static MapperConfiguration InitializeAutoMapper() 
    { 
     MapperConfiguration config = new MapperConfiguration(cfg => 
     { 
      cfg.AddProfile(new WebMappingProfile()); //mapping between Web and Business layer objects 
      cfg.AddProfile(new BLProfile()); // mapping between Business and DB layer objects 
     }); 

     return config; 
    } 
} 

Профили примеры

//Profile number one saved in Web layer 
public class WebMappingProfile : Profile 
{ 
    public WebMappingProfile() 
    { 
     CreateMap<Question, QuestionModel>(); 
     CreateMap<QuestionModel, Question>(); 
     /*etc...*/ 
    } 
} 

//Profile number two save in Business layer 
public class BLProfile: Profile 
{ 
    public BLProfile() 
    { 
     CreateMap<BLModels.SubModels.Address, DataAccess.Models.EF.Address>(); 
     /*etc....*/ 
    } 
} 

Wire automapper в рамках DI (это единство)

public static class UnityWebActivator 
{ 
    /// <summary>Integrates Unity when the application starts.</summary> 
    public static void Start() 
    { 
     var container = UnityConfig.GetConfiguredContainer(); 
     var mapper = MappingProfile.InitializeAutoMapper().CreateMapper(); 
     container.RegisterInstance<IMapper>(mapper); 

     FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First()); 
     FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container)); 

     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

     // TODO: Uncomment if you want to use PerRequestLifetimeManager 
     // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule)); 
    } 

    /// <summary>Disposes the Unity container when the application is shut down.</summary> 
    public static void Shutdown() 
    { 
     var container = UnityConfig.GetConfiguredContainer(); 
     container.Dispose(); 
    } 
} 

Используйте IMapper в вас классе для картографирования

public class BaseService 
{ 
    protected IMapper _mapper; 

    public BaseService(IMapper mapper) 
    { 
     _mapper = mapper; 
    } 

    public void AutoMapperDemo(){ 
     var questions = GetQuestions(token); 
     return _mapper.Map<IEnumerable<Question>, IEnumerable<QuestionModel>>(questions); 
    } 

    public IEnumerable<Question> GetQuestions(token){ 
     /*logic to get Questions*/ 
    } 
} 

Мой оригинальный пост можно найти здесь: http://www.codeproject.com/Articles/1129953/ASP-MVC-with-Automapper-Profiles

 Смежные вопросы

  • Нет связанных вопросов^_^