2010-09-14 60 views
9

我们目前有一个WCF服务,它已经使用它自己的DataContracts进行枚举设置。然后,我们在DataContract枚举和业务层中可用的Common Enums之间建立一个映射层。同样的事情发生在客户端 - 客户端枚举和数据契约之间的映射层EnumWCF数据合同和共享的枚举

今天早上我们一直在讲我们通过WCF服务暴露我们的共同枚举,然后到客户端,我们不知道如果这是最佳做法。因此,这个问题归结为是否允许跨来源于我们的后端,通过服务并进入客户端系统的枚举问题的横切,或者如果我们应该继续保持我们的数据合约与​​基本代码库分离。我们正在努力为我们的服务实现SOA的最佳实践。

这是什么人民的想法?

回答

5

如果您想要最佳实践,当前的设置听起来非常合理 - 您可以使用单独的DTO层轻松管理边界的版本控制和其他验证/映射。

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

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

1

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

+0

通过webservice/WCF传递的枚举应该只传递文本值 - 所使用的数字是特定于客户端的。如果数字是数值,您应该只传递数字。请参阅http://stackoverflow.com/questions/3600818/wsdl-enums-and-c-its-still-murky – Quango 2011-07-08 10:28:22

0

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

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

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