c# - 在 WCF 契约(Contract)中为泛型类型添加 AutoMapper 类型映射约定

标签 c# wcf generics automapper conventions

我有一个在其数据协定中使用泛型的 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/

相关文章:

c# - WCF 使用接口(interface)参数调用服务方法导致 SocketException

c# - WCF 是否使用 ThreadPool 为 PerCall 服务创建新实例?

android - Kotlin - 当表达式返回函数类型

c# - 对接口(interface)和实现感到困惑

c# - Visual Studio 本地主机提示登录

c# - 尝试通过应用而非 Management Studio 连接时登录失败

angular - 尝试验证 Azure AD token 时收到错误 "IDX10511: Signature validation failed"

java - 这在 Java 中的 ArrayList 中是什么意思

swift - 为两种不同类型的数据管理单个变量

c# - 带有MVVM的Datagrid中的wpf级联组合框