WCF数据合同和枚举共享

时间:2010-09-14 12:30:44

标签: c# wcf soa

我们目前有一个WCF服务,它已经为枚举设置了自己的DataContracts。然后,我们在DataContract枚举和业务层中可用的公共枚举之间有一个映射层。同样的事情发生在客户端 - 客户端枚举和数据协定枚举

之间的映射层

我们今天早上一直在讲述通过WCF服务公开我们的常见枚举然后到客户端,我们不知道这是否是最佳做法。因此,该问题归结为是否允许交叉关注来自我们后端,通过服务和客户端系统的枚举或者我们是否应该继续将我们的数据合同与基本代码库分开是一件好事。我们正在努力为我们的服务实现最佳实践SOA。

人们对此有何看法?

3 个答案:

答案 0 :(得分:5)

如果你想要最好的练习,当前的设置听起来很合理 - 你可以通过一个单独的DTO层很容易地在边界管理版本控制和其他验证/映射。

如果你在边界上有一个完整的DTO图层(而不是在边界上暴露你的常规/事务域实体),这将会加倍应用,这听起来像你可能。

缺点是增加维护,但它使它们非常灵活,并避免任何意外问题。例如,它通常不适用于WCF,但常规 Web服务的典型错误是添加非默认构造函数(从而删除编译器生成的默认构造函数)。哎呀!没有更多的网络服务。有一个类似的主题由无辜的变化引起的错误,可以通过分离出DTO来避免。

答案 1 :(得分:1)

我会在服务级别使用单独的数据协定枚举,从版本兼容性POV映射到BL枚举。即使来自BL的枚举值发生变化,这将允许将来保持相同的服务枚举值和解释。例如,您可以在服务和业务级别以4-5个相同的值(0,1,2,3,4)开始。将来,您决定将业务枚举修改为基于标志的解释 - 因此,具有单独的服务枚举将允许将这些值映射到新的业务枚举值(希望在该级别可以获得相同的解释) - 对于考试3现在可以在业务枚举中映射到8。

答案 2 :(得分:0)

我目前处于相同的情况。一种解决方案是使用另一个可以调用ServiceManager的薄层。此层中的方法接受数据协定枚举,然后在调用BL方法时将数据协定枚举类型转换为BL枚举类型。

但我已经决定我的解决方案是删除数据合约枚举,只使用字符串常量。

如果您有更好的解决方案,请分享。