这两种定义Web服务方法参数的方法的优缺点是什么?

时间:2011-11-15 17:47:16

标签: web-services

我有一个我需要扩展的现有Web服务,但它还没有投入生产。所以,我可以自由地改变我认为合适的合同。但我不确定定义方法的最佳方法。

我倾向于方法2 ,除了我想不出好名字给出参数类之外别无他法!

使用方法2 而不是方法1 是否有任何主要缺点?

方法1

[DataContract(Namespace = Constants.ServiceNamespace)]
public class MyParameters
{
    [DataMember(Order = 1, IsRequired = true)]
    public int CompanyID { get; set; }

    [DataMember(Order = 2, IsRequired = true)]
    public string Filter { get; set; }
}

[ServiceContract(Namespace  = Constants.ServiceNamespace)]
public interface IMyService
{
    [OperationContract, FaultContract(MyServiceFault)]
    MyResult MyMethod(MyParameters params);
}

方法2

public interface IMyService
{
    [OperationContract, FaultContract(MyServiceFault)]
    MyResult MyMethod(int companyID, string filter);        
}

1 个答案:

答案 0 :(得分:1)

假设您正在使用WCF和WS-I Basic Profile,方法2优于方法1的最大缺点是它使合同的演变在未来变得更加困难。参数类允许添加新字段而不创建新版本的合同,而直接方法调用则不允许(因为在WS-I Basic中,不允许重载方法)。在WCF中,你可以通过一些箍来解决这个限制,但这一切都会导致一个不太可读,配置更多的解决方案。

对于命名参数类,我发现根据它所代表的基础消息来考虑方法是有帮助的 - 方法名称是一个动作,参数是与该动作相关的消息。如果你告诉WCF生成消息契约(当你添加一个服务引用时),你将会看到所有这些内容,它有时可以帮助理解它是如何挂起的,虽然它确实使API更加冗长,并且是最不必要的当时。