【问题标题】:Automapper - Convert UTC to Specific timezoneAutomapper - 将 UTC 转换为特定时区
【发布时间】:2020-06-16 09:34:43
【问题描述】:

在将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

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

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

    【讨论】:

    • 另外,如果 Source 和 Dest 接口,IValueResolver 仍然可以使用。然后地图可以简单地为CreateMap&lt;ISrc, IDest&gt;().ForMember(...).IncludeAllDerived()。这将涵盖所有实施的 DTO。
    • 以前是这样的。但现在这个案例更加精简。 docs.automapper.org/en/latest/Value-transformers.html
    猜你喜欢
    • 2020-03-21
    • 2021-12-24
    • 2014-08-12
    • 2014-07-15
    • 2021-01-04
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多