【问题标题】:Checking for an attribute on a destination property inside a custom AutoMapper TypeConverter检查自定义 AutoMapper TypeConverter 中目标属性的属性
【发布时间】:2011-05-26 21:13:56
【问题描述】:

我有一个自定义类型转换器,可以将 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...
        }
    }
}

所以这段代码工作得很好(显然为了便于阅读,这里有更多的错误检查和变量)。

我的问题:

  1. 这是解决此问题的正确方法吗?在 AutoMapper 代码库中,我没有发现任何在谷歌上搜索或探索的内容。
  2. 我将如何对此进行单元测试?我可以在传入的ResolutionContext 上设置父目标类型,有点时髦,但不能设置成员名称,因为IMemberAccessor 的所有实现者都是AutoMapper 的内部。这一点,而且它的设置非常难看,这让我真的不支持它,或者我做错了。

我正在使用 AutoMapper 的最新 TeamCity 版本,顺便说一句。

【问题讨论】:

    标签: automapper


    【解决方案1】:

    不要对此进行单元测试,使用集成测试。只需编写一个实际调用 AutoMapper 的映射测试,验证此类型转换器支持的任何用例是否可以从外部工作。

    作为一般规则,对别人 API 的扩展点进行单元测试对我来说没有多大价值。相反,我尝试通过前门并确保我也正确配置了扩展点。

    【讨论】:

      猜你喜欢
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多