自动映射器-将UTC转换为特定时区

时间:2020-03-03 23:03:23

标签: c# automapper

我有以下内容,当将DateUtc从源转换为目标Date时,我想应用转换。现在,我编写的以下转换器将在特定字段中工作,因为已指定该字段。

我希望我的转换器更加灵活,我可以传递SourceDto1DestDto1之类的SourceDto2DestDto2以外的其他对象

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可能有用,但我不确定如何从DI中注入我的Settings

1 个答案:

答案 0 :(得分:0)

您可以为此创建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的实现,它允许您将依赖项注入解析器,同时还允许您在成员级别将其用于任何对象(请注意,源和目标类型设置为{ {1}})。然后,您可以为每个类型映射配置相同的解析器,例如:

object