Automapper 8.0+:将所有日期时间转换为 UTC

5
我希望通过将日期时间未指定的属性映射到UTC时区,只需为Automapper 8.0的所有属性添加kind来实现映射。我找到了一些可能有效的解决方案,但它们是针对使用ResolveUsing而不是MapFrom()的较旧版本的Automapper。 如何实现这个目标?
cfg.ForAllPropertyMaps(map => map.TypeMap.SourceType is IDbType && (map.SourceType == typeof(DateTime?) || map.SourceType == typeof(DateTime)), (map, expression) => { expression.ResolveUsing(o => { return #DO_WHATEVER_YOU_NEED# }); }); 

我想仅对从服务器到客户端传输的所有实体和日期时间进行映射,以添加Utc Kind。以上代码来自github.com/AutoMapper/AutoMapper/issues/1650


只需使用 MapFrom(),请参见 https://docs.automapper.org/en/stable/8.0-Upgrade-Guide.html#resolveusing - Progman
1个回答

7

您可以在 CreateMap() 条目中使用 ConvertUsing() 来处理 DateTime 类型。代码可能如下所示:

cfg.CreateMap<DateTime, DateTime>().ConvertUsing((s, d) => {
    return DateTime.SpecifyKind(s, DateTimeKind.Utc);
});

请查看下面的示例代码:

class TestDTO {
    public DateTime SomeProp {get; set;}
}

class Program
{
    static void Main(string[] args)
    {
        var config = new MapperConfiguration(cfg => {
            cfg.CreateMap<TestDTO, TestDTO>();
            cfg.CreateMap<DateTime, DateTime>().ConvertUsing((s, d) => {
                return DateTime.SpecifyKind(s, DateTimeKind.Utc);
            });
        });
        TestDTO dto = new TestDTO {
            SomeProp = DateTime.Today
        };
        var mapper = new Mapper(config);
        DateTime now = dto.SomeProp;
        Console.WriteLine($"{now} - {now.Kind}");
        TestDTO changed = mapper.Map<TestDTO>(dto);
        DateTime nowWithKind = changed.SomeProp;
        Console.WriteLine($"{nowWithKind} - {nowWithKind.Kind}");            
    }  
}

这将生成以下输出:
6/16/2020 12:00:00 AM - Local
6/16/2020 12:00:00 AM - Utc

可以针对所有属性而不是单个DTO进行操作吗? - user9335104
@DankX1 很可能是这样,因为有像 ForAllMaps() 这样的帮助方法,但这取决于您实际使用的配置。或者您不使用 CreateMap() 吗? - Progman
@DankX1 那问题出在哪里呢?你定义了 DateTime -> DateTime 的映射,但是 DateTime 的“kind”被改变了。 - Progman
哦,好的,它适用于可空和非日期时间吗?我需要另一个映射DateTime?,DateTime? - user9335104
@DankX1 它也适用于 DateTime?。如果不行,你可以自己添加一个 CreateMap<DateTime?, DateTime?>() - Progman

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