Работа с automapper

Установим autommapper и научимся создавать пользовательский automapper.

  1. Установим automapper при помощи nuget. Создаем класс AutoMapperDefaultProfile, который будет описывать все наши преобразования объектов.
    public class AutoMapperDefaultProfile : Profile
    {
        protected override void Configure()
        {
            //CreateMap<ValueSimpleForm, ProductsValue>()
            // .ForMember(dest => dest.Value_long, opt => opt.MapFrom(src => Utils.ToLong(src.Value_double)));
        }
    }
    

    Зарегистрируем этот профиль в Global.asax

    Mapper.Initialize(x => x.AddProfile<AutoMapperDefaultProfile>());
    

    Чтобы конвертировать Filter в FilterForm вызываем статический метод Map:

    FilterForm form = Mapper.Map<Filter, FilterForm>(filter);
    
  2. Класс Mapper это обертка над двумя классами ConfigurationStore и MappingEngine.
    ConfigurationStore configuration = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
    MappingEngine mapper = new MappingEngine(configuration);
    

    Я создал статический класс, который создает эти два объекта. А так же имеет метод Map (и его перегрузки), как и класс Mapper.

    public static class Custom1Mapper
    {
        private static IConfiguration _configuration;
        private static IMappingEngine _engine;
    
        public static IConfiguration Configuration { get {
            return _configuration;
        } }
    
        public static IMappingEngine Engine { get {
            return _engine;
        } }
        public static void Initialize(Action<IConfiguration> action)
        {
            _configuration = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);
            _engine = new MappingEngine((IConfigurationProvider)_configuration);
            action.Invoke(_configuration);
        }
        public static TDestination Map<TSource, TDestination>(TSource source)
        {
            return _engine.Map<TSource, TDestination>(source);
        }
        public static TDestination Map<TSource, TDestination>(TSource source, TDestination destination)
        {
            return _engine.Map<TSource, TDestination>(source, destination);
        }
        public static TDestination Map<TSource, TDestination>(TSource source, TDestination destination, Action<IMappingOperationOptions> opts)
        {
            return _engine.Map<TSource, TDestination>(source, destination, opts);
        }
    }
    

    Создадим профиль, описывающий все преобразования объектов для нашего пользовательского automapper-а.

    public class AutoMapperCustom1Profile : Profile
    {
        protected override void Configure()
        {
            //CreateMap<ProductsAttribute, ProductsAttribute>()
            // .ForMember(dest => dest.Id, opt => opt.MapFrom(src => 0));
        }
    }
    

    И зарегистрируем в Global.asax

    Custom1Mapper.Initialize(x => x.AddProfile<AutoMapperCustom1Profile>());
    

    Вызывать метод Map так же как и в классе Mapper. То есть так:

    FilterForm form = Custom1Mapper.Map<Filter, FilterForm>(filter);
    
  3. Если у вас установлен Ninject или другой контейнер объектов, то можно Custom1Mapper сделать не статическим, что позволит создавать множество экземпляров пользовательских mapper-ов.
    Итак, уберем все модификаторы static. Затем в Ninject-е привяжем наш экземпляр таким образом:

    Bind<CustomMapper>().ToSelf().InSingletonScope().Named("Custom1Mapper");
    

    А в Global.asax регистрируем так:

    kernel.Get<CustomMapper>("Custom1Mapper").Initialize(x => x.AddProfile<AutoMapperCustom1Profile>());
    

    Внедряем наш экземпляр в сервисы таким образом:

    [Inject, Named("Custom1Mapper")]
    public CustomMapper Custom1Mapper { get; set; }
    

    И используем так же как и в пункте 2.

Ссылки:

Работа с automapper: Один комментарий

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>