Работа с 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.

Ссылки:

По теме:
Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

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

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