为WCF合同中的通用类型添加AutoMapper类型映射约定

时间:2011-02-18 04:25:45

标签: c# wcf generics automapper conventions

我有一个在其数据协定中使用泛型的WCF服务,例如(简化):

public GetDetails(StatusField<string> status);

现在,WCF通过为泛型中的每个可能的T值创建非泛型等效类型来支持泛型。因此,对于上面的示例,使用WCF服务的客户端将看到上述函数的以下签名:

public GetDetails(stringStatusField status);
//...

现在,客户端拥有StatusField类的通用版本的副本。我们想在客户端中使用AutoMapper,在这个通用StatusField和WCF上面生成的类型(例如stringStatusField)之间进行映射,以便我们可以调用该服务。我们可以通过在客户端启动时手动创建映射来完成此操作,如下所示:

Mapper.CreateMap<StatusField<string>, stringStatusField>();

然而,这很费力,因为WCF已经转换了50多个可能的值。扩展这个想法,我们可以使用反射自动为所有类型创建地图,这是我们目前使用的解决方案。

理想情况下,我希望看到的是一种与AutoMapper架构相关联的解决方案,以避免必须手动进行反射。从概念上讲,这需要一些定义约定的方法,AutoMapper将使用它来将两种类型绑定在一起,类似于它在匹配属性时允许指定自定义约定的方式。到目前为止,我还没有看到这样做的方法,这是我想在这里回答的问题,如果有人知道如何做到这一点,特别是与上述情况有关。

BTW我知道有些人可能会想到Mapper.DynamicMap()作为解决这个问题的方法。首先,我们不想使用它,因为它意味着调试可能更难(如其他帖子中的一些类似的指示)以及如果StatusField深度嵌套在传递给WCF方法的对象图中,我不确定此解决方案将起作用,并可能导致类型错误映射和其他此类问题。如果可能,我真的想具体定义允许的映射。

1 个答案:

答案 0 :(得分:0)

不确定AutoMapper是否提供您所支持的支持,但如果确实如此,则会按照您的建议使用反射。

如果由于性能问题(这应该是一次性启动成本)而反对反射解决方案,那么基于T4模板的代码生成解决方案可能值得考虑吗?