我在核心库中有大量的域模型,其中还包含获取各种模型集的方法。多个WCF服务项目引用此库并发布集合,例如
GetProducts(int categoryId)
我最初的方法是使用DataContract和DataMember属性修饰域模型,并从WCF服务方法返回它们。但是我看到了这种方法的缺陷,因为现在有些服务需要将不同的模型属性序列化到其他服务。
我想我有两个选择:
在每个WCF项目中,为该项目创建具有必要属性和属性的DTO类,并从服务方法返回这些属性和属性。从域模型构造DTO。 这看起来像“正确”的方法,但在域模型扩展时设置和维护非常耗时。
编写我自己的xml序列化程序,根据项目的不同,动态选择要在运行时序列化的域模型的哪些属性。我不知道这是否可能!
(我也考虑了设置属性的“技巧”,我不想将其序列化为默认值,然后在序列化之后将其更改回来,但它太过于繁琐且闻起来很糟糕)
是否有其他方法或有办法减少#1中涉及的手工工作?
答案 0 :(得分:1)
右边的方法#1。设计DTO以满足客户的要求,并确保它与WCF一起正常工作。
通过使用对象到对象映射器,可以大大简化从域对象到DTO的映射。 AutoMapper是.NET项目中的常见选择。它灵活,性能良好。
答案 1 :(得分:0)
有一个2b变种。如果使用[DataContract]标记对象,使用[DataMember]属性标记属性,则只会序列化这些对象。
我已经使用这种方法取得了一些成功。真正的问题是它总是与您想要序列化的属性相同。例如,如果您有权访问地址对象,那么地址类中的所有内容都是公开可见的,这是可行的。即使您在内部保留了一些您不会暴露的距离算法的地理坐标。
但是,如果有人这样做,并且有些人无法访问客户的完整信用卡号,那么如果您尝试序列化客户,则此方法将成为问题。 (如果地址是一个单独的对象,仍然可以单独确定访问客户的地址。)
也许不是ddd视角中最好的例子,因为地址很可能不是一个实体,但我希望你能理解我的注意事项