我有一个在其数据协定中使用泛型的 WCF 服务,例如(简化):
public GetDetails(StatusField<string> status);
现在 WCF 通过为泛型中 T 的每个可能值创建非泛型等效类型来支持泛型。因此,对于上面的示例,使用 WCF 服务的客户端将看到上述函数的以下签名:
public GetDetails(stringStatusField status);
//...
现在客户端拥有 StatusField 类的通用版本的副本。我们想在客户端使用 AutoMapper,在这个通用的 StatusField 和上面由 WCF 生成的类型(例如 stringStatusField)之间进行映射,以便我们可以调用该服务。我们可以通过在客户端启动时手动创建 map 来做到这一点,如下所示:
Mapper.CreateMap<StatusField<string>, stringStatusField>();
然而,这很费力,因为 WCF 已经转换了 50 多个可能的值。扩展这个想法,我们可以使用反射自动为所有类型创建映射,这就是我们目前使用的解决方案。
理想情况下,我希望看到一个与 AutoMapper 架构相关的解决方案,以避免必须手动进行反射。从概念上讲,这将需要某种方式来定义 convention,AutoMapper 将使用它来允许它将两种类型联系在一起,类似于它允许在匹配属性时指定自定义约定的方式。到目前为止,我还没有找到做到这一点的方法,如果有人知道如何做到这一点,这就是我想在这里回答的问题,特别是与上述场景相关的问题。
顺便说一句,我知道有些人可能会考虑将 Mapper.DynamicMap() 作为解决此问题的方法。首先,我们不想使用它,因为它意味着调试可能会更难(正如其他类似帖子中的一些人所指出的那样),而且如果 StatusField 深深嵌套在传递给 WCF 方法的对象图中,我不确定该解决方案可行,并可能导致类型被错误映射和其他此类问题。如果可能的话,我真的很想具体定义允许的映射。
最佳答案
不确定 AutoMapper 是否提供了您所追求的支持,但如果提供了,它将按照您的建议使用反射。
如果您出于性能考虑(这应该是一次性启动成本)反对反射解决方案,那么也许基于 T4 模板的代码生成解决方案可能值得考虑?
关于c# - 在 WCF 契约(Contract)中为泛型类型添加 AutoMapper 类型映射约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5037595/