2010-09-20 54 views
0

我有一个服务方法,它将提供一些参数,这些参数将随着参数的名称和数量而改变(我将知道ACTION字段所期望的参数)关于Web服务和WCF的设计问题

为了解决像上面这样的设计问题,我创建了一个Web服务,它的参数将始终提供,还有一个参数可以接受用密钥< *>值编写的字符串。

使用MyServiceMethod:

Action : Action1 
Param2: Hello 
param3: world 
Additional_Params: name<*>Jack;address<*>2 street; 

(我知道,有措施1我从谁使用该服务的人员姓名和地址值)使用MyServiceMethod第二次

Action : Action5 
Param2: Hello 
param3: world 
Additional_Params: numOfHours<*>3;Sum<*>342;myName<*>asaf; 

我认为这不是针对每个ACTION接受不同数据的Web服务的最佳设计,有没有更好的方法来实现这一点?

+0

有多少种不同的操作,它们多久更换一次? – 2010-09-20 20:40:16

+0

并不是很多行为,并非如此。 – Rodniko 2010-09-21 14:26:32

+0

谢谢,我写了一个答案。 – 2010-09-21 16:55:23

回答

0

我那种已经在评论回答,但在这里它是在一个地方:

如果你有一个小许多不同的功能,而很少改变,最好的办法就是揭露每一个单独的功能。当需要新的代码时,你可以扩展你的接口而不破坏现有的代码。另一方面,如果你有更多的功能和/或他们经常变化,那么简单但灵活的界面会更好。您可以公开一个单一的函数,并将XML文档作为请求DTO的序列化。这将需要一些demux逻辑(switch/case或者更好的是,代表查找表)将请求分派给处理程序。这种方法很难实现,但更容易维护。

2

如果您有一小组操作,那么对每个操作使用单一方法可能是最好的设计策略。这可能不需要太多的工作来挑选后端,在我看来,这并不令人感到羞耻。

如果你有一个大组动作,你可以代表你想要做一个数据结构是什么,以及只传递该参数。

我不会说你的方式无论如何,提出这样做​​是错误的,但实际上最终可能会为你创造更多的工作,并在以后让你或其他开发者感到困惑。

+0

问题不仅仅是这个集合有多大,而且还有多变。如果它永远不会改变,那么即使有大量的功能也可以。 – 2010-09-20 20:54:42

2

我不是你想做什么100%清楚,但如果你知道Action1将始终以“名”和“地址”的名称/值对被调用,Action5将被称为与“numOfHours”,“Sum”和“myName”,然后我同意@Eugarps答案和@Steven_Sudit相关评论。只需将它们作为每个操作的方法参数。

但是,如果你不知道什么是变量参数将要(只调用的操作时,你会得到一定的名称/值对),那么我会至少使用一个IDictionary<string, object>而不是字符串。这样做意味着您可以避免解析字符串值。如果传递的值是你自己类型的实例(而不是原语),那么你还需要使用ServiceKnownType属性来告诉序列化程序。

+0

另一种方法是将接口更改为接受XML文档,该文档本身可能是DTO的序列化。 – 2010-09-21 12:01:53

+0

我认为一个XML解决方案会导致一大块代码来验证XML结构(xsd)并分析XML ....我不知道.... – Rodniko 2010-09-21 14:27:48

+0

我可以在GET url中传递IDictionary吗? – Rodniko 2010-09-21 14:58:01