我正在组建一个处理大型搜索的WCF服务(目前有50-60个参数,将来更有可能添加)。为了解决这个问题,我有一个Search对象,其中包含将在消息对象中传递给服务的所有条件。虽然所有搜索参数都必须可用,但通常情况是2-3个参数接收用户输入而其他参数为空。在我看来,如果只使用几个字段,则通过每个方法传递整个对象是没有意义的。我正在寻找一种技术,它将提取与其值一起使用的字段,然后可以对其进行验证并将其传递到数据层以执行搜索。我能想到的几种实现方法包括:
Dictionary<string, object>
。这里想到的问题是我丢失了搜索参数的类型,这意味着数据层搜索功能将是一个巨大的案例语句,每个潜在字段都有硬编码的强制转换值。这似乎有点矫枉过正,并且造成耦合太紧张。List<SearchValue>
。这仍然导致搜索中的大案例检查,而不是属性,它将是按类型。这使得该过程更具“通用性”(即,与使用的搜索值的组合无关)具有一定的吸引力,但它也感觉我正在重新发明轮子。我对这些技术缺少什么利弊?有没有更好的方法来实现我的目标?
答案 0 :(得分:0)
在客户端和服务之间传递整个对象的唯一问题是,当序列化请求中有太多空的xml节点时,必须使其更大。你想要处理这件事吗?我会说,无论如何这不是什么大问题,也不值得发明复杂的自定义机制。
答案 1 :(得分:0)
我不确定这是否适用于此通信线路,但可能是DataMemberAttribute上的EmitDefaultValue属性?
答案 2 :(得分:0)
在第一点,您提到使用Reflection
将您的类型转换为Dictionary
。而另一方面,为什么不编写反向逻辑来再次使用Dictionary
将Reflection
转换回您的类型?
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中帮助减少传输和序列化开销。