假设这个简单的方案:我的客户有一个已经有效的.NET应用程序,他/她想通过WCF公开一些功能。因此,他给了我一个集会,遏制了一个公开的公共班级,以揭示关注方法。

OrderDetail GetOrderDetail (int orderId) // Suppose OrderDetail has {ProductId, Quantity, Amount)

现在,我希望有些订购(金额)的成员不要序列化。根据 http://msdn.microsoft.com/en-us/library/aa738737.aspx, ,这样做的方法是通过[DataContract]和[DataMember]/[忽略的AtaMember]属性。但是,这对我来说不是一个选择,因为我无法修改客户端的源代码。因此,我正在寻找一种方法来指定在类型的定义之外我想序列化的成员。应该看起来像这样的东西:

    [OperationContract]
    [IgnoreMember(typeof(OrderDetail), "Amount" )]
    OrderDetail QueryOrder(int orderId){
          return OrderDetail.GetOrderDetail(orderId)  
    }

有什么办法可以解决吗?谢谢,伯纳贝

有帮助吗?

解决方案

不要在电线上发送客户端对象,而是从仅包含要发送和发送的信息的客户对象创建DTO。

这使您可以准确地控制发送了哪些信息,并且与传递消息的WCF意图保持一致

因此,创建一个 OrderDetailDto class 并用来自 OrderDetail 由call返回客户端代码中的方法。装饰 OrderDetailDtoDataContractDataMember 属性(您可以在此处重命名类,以便在WCF返回时将其返回,并带有名称 OrderDetail)

对客户端代码中的所有对象重复此操作,以便您基本上从dto-> client对象和client对象 - > dto转换为“服务边界”

编辑

虽然可能有一个选项可以允许您要求的东西(我不知道一个,但希望其他人可能会)考虑,当您发送发送时,将客户对象作为DTOS作为两个目的(客户端对象)和消息合同),它违反了单个职责原则,当您将其放在客户端时,它们将不是同一客户端对象,只有具有相同属性的DTO,您将无法在客户端中获得行为侧对象(至少不是在服务器端和客户端上共享库)。

通过将数据合同绑定到对象,您最终还必须管理对客户对象和数据合同的更改为一件事。当它们分开时,您可以在无必要更改DTO的情况下管理对客户端对象的更改,您可以以不同的方式填充它们。

尽管创建DTO似乎是很多工作,但最终我认为这是值得的。

其他提示

您将必须编写一个只能公开所需属性的包装类别,并简单地调用客户提供的类以获取其值。

唯一的其他选择是使用反射散发新的动态类并序列化(请参阅 http://msdn.microsoft.com/en-us/library/system.reflection.emit.typebuilder.aspx),但是除非您需要建立很多包装班,否则这可能不值得。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top