Automapper - конвертировать UT C в Specifi c часовой пояс - PullRequest
4 голосов
/ 04 марта 2020

У меня есть следующее, что при переводе DateUtc из источника в dest Date я хочу применить преобразование. Теперь следующий конвертер, который я написал, будет работать для указанного поля c, потому что оно указано.

Я бы хотел, чтобы мой конвертер был более гибким, чтобы я мог передавать другой объект, чем SourceDto1, DestDto1 такие как SourceDto2 и DestDto2

public class SourceDto1
{
   public DateTime DateUtc {get;set;}
}
public class DestDto1
{
   public DateTime Date {get;set;}
}
public class SourceDto2
{
   public DateTime DateUtc {get;set;}
}
public class DestDto2
{
   public DateTime Date {get;set;}
}

конвертер

public class AttachmentCreatedDateResolver : IValueResolver<SourceDto1, DestDto1 DateTime>
    {

        private readonly Settings _settings;
        public AttachmentCreatedDateResolver(Settings settings)
        {
            _settings = settings;
        }


        public DateTime Resolve(SourceDto1 source, DestDto1 destination, DateTime destMember, ResolutionContext context)
        {
            TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo(_settings.TimeZone);
            var converted = TimeZoneInfo.ConvertTimeFromUtc(source.DateUtc, tzi);
            return converted;
        }
    }

Я думаю, я не хочу создавать разные классы резолвера для каждой пары объектов, которые мне нужны конвертировать даты между свойствами.

ITypeConverter может работать, но я не был уверен, как вставить мой Settings из DI

1 Ответ

0 голосов
/ 04 марта 2020

Вы можете создать реализацию IMemberValueResolver для этого:

public class AttachmentCreatedDateResolver : IMemberValueResolver<object, object, DateTime, DateTime>
{
    private readonly Settings _settings;
    public AttachmentCreatedDateResolver(Settings settings)
    {
        _settings = settings;
    }

    public DateTime Resolve(object source, object destination, DateTime sourceMember, DateTime destMember, ResolutionContext context)
    {
        TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo(_settings.TimeZone);
        var converted = TimeZoneInfo.ConvertTimeFromUtc(sourceMember, tzi);
        return converted;
    }
}

Это ведет себя подобно реализации IValueResolver, что позволяет вводить зависимости в преобразователь, пока также позволяя использовать его на уровне элемента для любого объекта (обратите внимание, что для типов источника и назначения установлено значение object). После этого вы сможете настроить этот же распознаватель для каждого сопоставления типов примерно следующим образом:

CreateMap<SourceDto1, DestDto1>()
    .ForMember(d => d.Date, opt => opt.MapFrom<AttachmentCreatedDateResolver, DateTime>(s => s.DateUtc));
CreateMap<SourceDto2, DestDto2>()
    .ForMember(d => d.Date, opt => opt.MapFrom<AttachmentCreatedDateResolver, DateTime>(s => s.DateUtc));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...