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



我有以下内容,当将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

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

最新更新