我有一个我需要扩展的现有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);
}
答案 0 :(得分:1)
假设您正在使用WCF和WS-I Basic Profile,方法2优于方法1的最大缺点是它使合同的演变在未来变得更加困难。参数类允许添加新字段而不创建新版本的合同,而直接方法调用则不允许(因为在WS-I Basic中,不允许重载方法)。在WCF中,你可以通过一些箍来解决这个限制,但这一切都会导致一个不太可读,配置更多的解决方案。
对于命名参数类,我发现根据它所代表的基础消息来考虑方法是有帮助的 - 方法名称是一个动作,参数是与该动作相关的消息。如果你告诉WCF生成消息契约(当你添加一个服务引用时),你将会看到所有这些内容,它有时可以帮助理解它是如何挂起的,虽然它确实使API更加冗长,并且是最不必要的当时。