gpt4 book ai didi

automapper - 使用 AutoMapper 全局应用值解析器

转载 作者:行者123 更新时间:2023-12-03 14:14:33 29 4
gpt4 key购买 nike

我正在尝试让 AutoMapper 为我们在 View 模型上本地化所有 DateTime 属性。我们在系统中的任何地方都使用 UTC 并将所有内容以 UTC 存储在数据库中,但我们希望自动将其转换为用户的时区以进行显示。

在查看了所有选项后,我决定使用 ValueResolver。这是解析器的要点:

public class LocalizedDateTimeFormatter : ValueResolver<DateTime, DateTime>
{
protected override DateTime ResolveCore(DateTime source)
{
// get company

return company.TimeZone.ConvertFromUtc(source);
}
}

我正在像这样设置映射:
Mapper.CreateMap<Entity, Model>()
.ForMember(dest => dest.Foo, opt => opt.ResolveUsing<LocalizedDateTimeFormatter>()
.FromMember(src => src.Foo));

这一切都很好,我很满意。但是,理想情况下,我们希望 View 模型上所有 DateTime 属性的约定默认使用此解析器。我开始反射(reflection) View 模型属性,挑选出 DateTime 属性,并使用 ForMember 和 FromMember 的重载来接收属性字符串名称,但这看起来......很难看。另外,复制 AutoMapper 的嵌套属性名称构建逻辑会很快崩溃。

问题:有什么简单的方法可以告诉 AutoMapper 像这样全局使用 ValueResolver 吗?要说“任何时候您将源上的 DateTime 属性映射到目标上的 DateTime 属性,请使用此解析器”?

我查看了 AutoMapper 的测试,没有发现任何可行的方法。

谢谢!

最佳答案

是的 - 但 MapperRegistry 的顺序略有变化。首先,创建一个从 DateTime 到 DateTime 的类型转换器:

Mapper.CreateMap<DateTime, DateTime>().ConvertUsing<CompanyTimeConverter>();

您的 CompanyTimeConverter 代码看起来很像您拥有的值解析器,除了它继承自 TypeConverter。

接下来,您必须更改 MapperRegistry 的顺序(我将继续更改它,这更有意义):
MapperRegistry.AllMappers = () => new IObjectMapper[] {
new DataReaderMapper(),
new TypeMapMapper(TypeMapObjectMapperRegistry.AllMappers()),
new StringMapper(),
new FlagsEnumMapper(),
new EnumMapper(),
new ArrayMapper(),
new EnumerableToDictionaryMapper(),
new DictionaryMapper(),
new ListSourceMapper(),
new CollectionMapper(),
new EnumerableMapper(),
new TypeConverterMapper(),
new AssignableMapper(),
new NullableMapper()
};

最初,“Assignable”映射器出现在“TypeConverter”映射器之前,因此如果两种类型可以相互分配,它就会这样做。

关于automapper - 使用 AutoMapper 全局应用值解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5666371/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com