代码之家  ›  专栏  ›  技术社区  ›  Laurence

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

  •  1
  • Laurence  · 技术社区  · 9 年前

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

    获取产品(int categoryId)

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

    我想我有两个选择:

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

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

    (我还考虑了将我不想序列化的属性设置为默认值,然后在序列化后将其更改回默认值的“技巧”,但这太麻烦了,而且味道很难闻)

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

    2 回复  |  直到 9 年前
        1
  •  1
  •   theDmi    9 年前

    在右侧接近#1。设计DTO,使其满足客户的要求,并确保其与WCF配合良好。

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

        2
  •  0
  •   Batavia    9 年前

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

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

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

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