1

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

GetProducts(int categoryId)

我最初的方法是用 DataContract 和 DataMember 属性装饰域模型,然后从 WCF 服务方法中返回它们。但是我看到了这种方法的缺陷,因为现在一些服务希望将不同的模型属性序列化给其他服务。

我想我有两个选择:

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

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

(我还考虑了将我不想序列化的属性设置为默认值的“技巧”,然后在序列化后将它们改回来,但它太繁琐而且闻起来很糟糕)

有没有其他方法或者有没有办法减少 #1 中涉及的手动工作?

4

2 回答 2

1

Approach #1 in the right one. Design the DTOs so that they meet the requirements of the client and make sure it works fine with WCF.

The mapping from domain objects to DTOs is something that can be greatly simplified by using an object to object mapper. AutoMapper is a common choice in .NET projects. It is flexible and has good performance.

于 2016-01-08T12:59:39.230 回答
0

有一个 2b 变体。如果您使用 [DataContract] 标记对象并使用 [DataMember] 属性标记属性,则只有那些将被序列化。

我使用这种方法取得了一些成功。问题真的变成了你想要序列化的属性是否总是相同的。例如,如果您可以访问地址对象,然后地址类中的所有内容都是公开可见的,这是可行的。即使您在内部保留了一组地理坐标,用于某些您不公开的距离算法。

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

从 ddd 的角度来看,也许不是最好的例子,因为 address 可能不是一个实体,但我希望你理解我的考虑

于 2016-01-08T15:51:18.333 回答