在 AutoMapper 中,您可以将相同的值解析器应用于多个成员吗
In AutoMapper can you apply the same value resolver to multiple members
我有一些映射代码如下
Mapper.CreateMap<CalculationQueryResult, CalculationViewModel>()
.ForMember(poco => poco.NomineeFee,
opt => opt.ResolveUsing<FormattedCurrencyInt>()
.FromMember(m => m.NomineeFee))
.ForMember(poco => poco.TotalContributions,
opt => opt.ResolveUsing<FormattedCurrencyInt>()
.FromMember(m => m.TotalContributions))
.ForMember(poco => poco.EquityInjection,
opt => opt.ResolveUsing<FormattedCurrencyInt>()
.FromMember(m => m.EquityInjection))
// ... SNIP Lots more members mapped with Formatted Currency Resolver
如您所见,我正在使用同一个解析器映射多个成员,以将整数转换为格式化的货币字符串。我正在为绝大多数但不是我的 poco class.
上的所有成员这样做
如果我不需要不断重复这些类型,所有这些成员都将使用基于约定的映射进行映射。为一项简单的任务编写大量代码。
有什么方法可以覆盖将 int 转换为单个地图的字符串的默认行为,然后在我想要不同的地方执行自定义 .ForMembers 。比如这样:
Mapper.CreateMap<CalculationQueryResult, CalculationViewModel>()
.SetDefault<int,string>(opt => opt.ResolveUsing<FormattedCurrencyInt>())
.ForMember(poco => poco.Count, x=>x.MapFrom(s => s.Count.ToString()));
您可以将默认映射创建为
Mapper.CreateMap<int, string>().ConvertUsing<FormattedCurrencyIntConverter>();
private class FormattedCurrencyIntConverter : TypeConverter<int, string> {
protected override string ConvertCore(int numericValue) {
return numericValue.ToString("C2"); // format here ...
}
}
但请注意,此映射规则将应用于所有整数!为某些成员覆盖此规则可能是可能的,但我没有测试它。
PS:我建议明确写下所有映射规则,不要依赖基于约定的映射。如果 属性 仅在一侧重命名,基于约定的映射就会中断,但是 IDE.
可以自动重构显式规则
您不能按照描述的方式将相同的值解析器应用于多个成员。
它可以覆盖所有映射的从 int 到 string 的默认映射,正如 Georg Patscheider 所建议的那样,但这可能会产生比原始问题更严重的副作用。
您必须逐行写出映射。
我有一些映射代码如下
Mapper.CreateMap<CalculationQueryResult, CalculationViewModel>()
.ForMember(poco => poco.NomineeFee,
opt => opt.ResolveUsing<FormattedCurrencyInt>()
.FromMember(m => m.NomineeFee))
.ForMember(poco => poco.TotalContributions,
opt => opt.ResolveUsing<FormattedCurrencyInt>()
.FromMember(m => m.TotalContributions))
.ForMember(poco => poco.EquityInjection,
opt => opt.ResolveUsing<FormattedCurrencyInt>()
.FromMember(m => m.EquityInjection))
// ... SNIP Lots more members mapped with Formatted Currency Resolver
如您所见,我正在使用同一个解析器映射多个成员,以将整数转换为格式化的货币字符串。我正在为绝大多数但不是我的 poco class.
上的所有成员这样做如果我不需要不断重复这些类型,所有这些成员都将使用基于约定的映射进行映射。为一项简单的任务编写大量代码。
有什么方法可以覆盖将 int 转换为单个地图的字符串的默认行为,然后在我想要不同的地方执行自定义 .ForMembers 。比如这样:
Mapper.CreateMap<CalculationQueryResult, CalculationViewModel>()
.SetDefault<int,string>(opt => opt.ResolveUsing<FormattedCurrencyInt>())
.ForMember(poco => poco.Count, x=>x.MapFrom(s => s.Count.ToString()));
您可以将默认映射创建为
Mapper.CreateMap<int, string>().ConvertUsing<FormattedCurrencyIntConverter>();
private class FormattedCurrencyIntConverter : TypeConverter<int, string> {
protected override string ConvertCore(int numericValue) {
return numericValue.ToString("C2"); // format here ...
}
}
但请注意,此映射规则将应用于所有整数!为某些成员覆盖此规则可能是可能的,但我没有测试它。
PS:我建议明确写下所有映射规则,不要依赖基于约定的映射。如果 属性 仅在一侧重命名,基于约定的映射就会中断,但是 IDE.
可以自动重构显式规则您不能按照描述的方式将相同的值解析器应用于多个成员。
它可以覆盖所有映射的从 int 到 string 的默认映射,正如 Georg Patscheider 所建议的那样,但这可能会产生比原始问题更严重的副作用。
您必须逐行写出映射。