防止从对象传递未使用的属性的最佳方法

时间:2010-12-21 16:54:20

标签: c# wcf object

我正在组建一个处理大型搜索的WCF服务(目前有50-60个参数,将来更有可能添加)。为了解决这个问题,我有一个Search对象,其中包含将在消息对象中传递给服务的所有条件。虽然所有搜索参数都必须可用,但通常情况是2-3个参数接收用户输入而其他参数为空。在我看来,如果只使用几个字段,则通过每个方法传递整个对象是没有意义的。我正在寻找一种技术,它将提取与其值一起使用的字段,然后可以对其进行验证并将其传递到数据层以执行搜索。我能想到的几种实现方法包括:

  • 使用反射循环遍历属性,并将非空属性添加到Dictionary<string, object>。这里想到的问题是我丢失了搜索参数的类型,这意味着数据层搜索功能将是一个巨大的案例语句,每个潜在字段都有硬编码的强制转换值。这似乎有点矫枉过正,并且造成耦合太紧张。
  • 使用Name,Value和System.Type属性创建SearchValue类,并使用反射构建List<SearchValue>。这仍然导致搜索中的大案例检查,而不是属性,它将是按类型。这使得该过程更具“通用性”(即,与使用的搜索值的组合无关)具有一定的吸引力,但它也感觉我正在重新发明轮子。

我对这些技术缺少什么利弊?有没有更好的方法来实现我的目标?

5 个答案:

答案 0 :(得分:0)

在客户端和服务之间传递整个对象的唯一问题是,当序列化请求中有太多空的xml节点时,必须使其更大。你想要处理这件事吗?我会说,无论如何这不是什么大问题,也不值得发明复杂的自定义机制。

答案 1 :(得分:0)

我不确定这是否适用于此通信线路,但可能是DataMemberAttribute上的EmitDefaultValue属性?

答案 2 :(得分:0)

在第一点,您提到使用Reflection将您的类型转换为Dictionary。而另一方面,为什么不编写反向逻辑来再次使用DictionaryReflection转换回您的类型?

实施例

Client Side&gt; YourType&gt;&gt;(Reflection)&gt;&gt; Dictionary&gt;频道&gt; Dictionary&gt;&gt;(Reflection)&gt;&gt; YourType&gt; Server Side

答案 3 :(得分:0)

我想到了一些选择:

  • 使用codegen创建进出Dictionary的打包/解包代码。生成器代码将使用反射,但打包/解包代码不会。

  • 将您的Search类拆分为多个较小的类,然后让您的Search类引用它们。如果未使用这些搜索参数,请不要实例化子类。也许是这样的:

    • 搜索
      • 包含一些常用字段的新类
      • 包含其他一些字段的新类

答案 4 :(得分:0)

拥有一个带有可选datamember的dataContract类。

[DataMember(EmitDefaultValue = false)]

public int salary = 0;

当值为默认值时,

DataContract序列化程序忽略此类成员。

MSDN推荐: 建议不要将EmitDefaultValue属性设置为false。只有在特定需要时才应该这样做,例如互操作性或减小数据大小。

您还在DataMember中拥有属性IsRequired,将其设置为false,并在EmitDefaultValue中帮助减少传输和序列化开销。