通过WCF服务从域模型公开数据的最佳方法

时间:2016-01-07 19:22:41

标签: c# wcf xml-serialization domain-driven-design wcf-serialization

我在核心库中有大量的域模型,其中还包含获取各种模型集的方法。多个WCF服务项目引用此库并发布集合,例如

GetProducts(int categoryId)

我最初的方法是使用DataContract和DataMember属性修饰域模型,并从WCF服务方法返回它们。但是我看到了这种方法的缺陷,因为现在有些服务需要将不同的模型属性序列化到其他服务。

我想我有两个选择:

  1. 在每个WCF项目中,为该项目创建具有必要属性和属性的DTO类,并从服务方法返回这些属性和属性。从域模型构造DTO。 这看起来像“正确”的方法,但在域模型扩展时设置和维护非常耗时。

  2. 编写我自己的xml序列化程序,根据项目的不同,动态选择要在运行时序列化的域模型的哪些属性。我不知道这是否可能!

  3. (我也考虑了设置属性的“技巧”,我不想将其序列化为默认值,然后在序列化之后将其更改回来,但它太过于繁琐且闻起来很糟糕)

    是否有其他方法或有办法减少#1中涉及的手工工作?

2 个答案:

答案 0 :(得分:1)

右边的方法#1。设计DTO以满足客户的要求,并确保它与WCF一起正常工作。

通过使用对象到对象映射器,可以大大简化从域对象到DTO的映射。 AutoMapper是.NET项目中的常见选择。它灵活,性能良好。

答案 1 :(得分:0)

有一个2b变种。如果使用[DataContract]标记对象,使用[DataMember]属性标记属性,则只会序列化这些对象。

我已经使用这种方法取得了一些成功。真正的问题是它总是与您想要序列化的属性相同。例如,如果您有权访问地址对象,那么地址类中的所有内容都是公开可见的,这是可行的。即使您在内部保留了一些您不会暴露的距离算法的地理坐标。

但是,如果有人这样做,并且有些人无法访问客户的完整信用卡号,那么如果您尝试序列化客户,则此方法将成为问题。 (如果地址是一个单独的对象,仍然可以单独确定访问客户的地址。)

也许不是ddd视角中最好的例子,因为地址很可能不是一个实体,但我希望你能理解我的注意事项