Automapper - 将UTC时间转换为特定时区的时间

5

我有以下的代码,当从源对象中将 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

你可以为此创建一个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));

或者,如果源和目标是接口化的,则仍然可以使用IValueResolver。然后,映射可以简单地为CreateMap<ISrc, IDest>().ForMember(...).IncludeAllDerived()。这将涵盖所有实现DTO。 - NPras
这曾经是一种方式。但现在这个案例更加简化了。http://docs.automapper.org/en/latest/Value-transformers.html - Lucian Bargaoanu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接