我有一个自定义类型转换器,可将UTC DateTime属性转换为公司的本地时间(在此处讨论:Globally apply value resolver with AutoMapper)。
如果视图模型上的属性标记有自定义DisplayInLocalTime
属性,我现在只希望此转换器能够做到这一点。
在类型转换器中,如果我实现原始ITypeConvert<TSource, TDestination>
接口,我可以检查转换的目标视图模型属性是否具有以下属性:
public class LocalizedDateTimeConverter : ITypeConverter<DateTime, DateTime>
{
public DateTime Convert(ResolutionContext context)
{
var shouldConvert = context.Parent.DestinationType
.GetProperty(context.MemberName)
.GetCustomAttributes(false)[0].GetType() == typeof(DisplayInLocalTimeAttribute);
if (shouldConvert) {
// rest of the conversion logic...
}
}
}
所以这段代码工作正常(显然有更多的错误检查和变量在那里以便于阅读)。
我的问题:
ResolutionContext
上设置父目标类型,但是无法设置成员名称,因为IMemberAccessor
的所有实现者都是AutoMapper内部的。这个,以及它的设置非常丑陋的事实,这使得我并没有真正支持它,或者我认为这一切都错了。我正在使用AutoMapper的最新TeamCity版本,BTW。
答案 0 :(得分:1)
请勿对此进行单元测试,请使用集成测试。只需编写一个实际调用AutoMapper的映射测试,验证无论这种类型转换器用于支持外部工作的用例。
作为一般规则,对其他人的API的扩展点进行单元测试对我没有多大价值。相反,我尝试通过前门并确保我也正确配置了扩展点。