C# 服务合同设计(运营签字)

C# 服务合同设计(运营签字),c#,wcf,web-services,servicecontract,C#,Wcf,Web Services,Servicecontract,我正在设计一些服务,我想得到一些关于我使用的约定的反馈 对于所有操作,我总是定义一个“上下文”对象和一个“结果”对象,因为有以下优点: 可扩展性:我可以在不更改接口的情况下向上下文添加参数或向结果添加对象 紧凑性:我在定义中只有一个对象,即使我需要很多参数 例如: [OperationContract] DoSomethingResult DoSomething(DoSomethingContext context) 无论如何,我不确定这是否是最好的方法,原因如下: 开销:我总是

我正在设计一些服务,我想得到一些关于我使用的约定的反馈

对于所有操作,我总是定义一个“上下文”对象和一个“结果”对象,因为有以下优点:

  • 可扩展性:我可以在不更改接口的情况下向上下文添加参数或向结果添加对象
  • 紧凑性:我在定义中只有一个对象,即使我需要很多参数
例如:

[OperationContract]    
DoSomethingResult DoSomething(DoSomethingContext context)
无论如何,我不确定这是否是最好的方法,原因如下:

  • 开销:我总是将响应属性包装到一个对象中。有时,结果对象没有属性
  • 版本控制:WCF有内置的合同版本控制,也许最好使用不同的版本来说明差异
事实上,我也使用同样的技术与正常的方法,所以这将是重要的,我得到一些反馈,建议,批评等等


谢谢

我认为这是一种完全合法的合同写作方式。我曾在许多项目中使用过此类合同,这是一种乐趣——在开发过程中非常简单(只需向对象添加一个属性,您就完成了),这是一种适用于所有服务的简单明了的模式,并允许对所有操作使用单一的验证方法

针对您的担忧:

  • 我认为创建空对象的开销一点也不重要。不要担心,除非它成为一个问题
  • 如果结果对象没有属性(即,您没有返回任何内容),那么只需返回void即可。返回一个空对象不会得到任何东西
  • 您可以(也可能应该)在对合同进行版本化时对这些对象进行版本化。您所做的并不能阻止您对对象进行版本控制

请注意,版本控制对象并不意味着像我之前看到的那样将它们更改为
DoSomethingResult\u v1
DoSomethingResult\u v2
。您应该使用名称空间进行版本更新;它使事情变得更清楚、更干净。只需在operation contract和data member属性的XML名称空间中添加一个版本。

我认为这是一种完全合法的合同编写方式。我曾在许多项目中使用过此类合同,这是一种乐趣——在开发过程中非常简单(只需向对象添加一个属性,您就完成了),这是一种适用于所有服务的简单明了的模式,并允许对所有操作使用单一的验证方法

针对您的担忧:

  • 我认为创建空对象的开销一点也不重要。不要担心,除非它成为一个问题
  • 如果结果对象没有属性(即,您没有返回任何内容),那么只需返回void即可。返回一个空对象不会得到任何东西
  • 您可以(也可能应该)在对合同进行版本化时对这些对象进行版本化。您所做的并不能阻止您对对象进行版本控制

请注意,版本控制对象并不意味着像我之前看到的那样将它们更改为
DoSomethingResult\u v1
DoSomethingResult\u v2
。您应该使用名称空间进行版本更新;它使事情变得更清楚、更干净。只需在operation contract和data member属性的XML名称空间中添加一个版本。

我认为这里没有任何性能问题,从代码所有者的角度来看,代码看起来很容易使用

我最担心的是,从消费者的角度来看,你的服务是如何运作的,这一点都不清楚。他们将不得不依赖单独的文档或错误消息

如果声明了您的服务所需的参数,那么对于不熟悉您的代码(即刚刚下载了WSDL)的人来说,使用您的服务会容易得多。您还可以获得开箱即用的良好验证程度

举例说明:

[OperationContract]     
DoSomethingResult DoSomething(DoSomethingContext context) 
vs

这一点主要与API的设计有关。与此无关的是,您既是服务的作者又是服务的消费者

我完全支持Kirk Broadhurst关于使用名称空间进行版本控制的建议。我用它,效果很好


编辑:再次阅读,我想我误读了你的文章。我在这里假设您的参数和返回值对象是您在所有服务中使用的一些通用对象。如果它们确实是针对每项服务的,那么这是一个很好的方法,我已经在很多场合成功地使用过。你会做得很好。

我认为这里没有任何性能问题,从代码所有者的角度来看,代码看起来很容易使用

我最担心的是,从消费者的角度来看,你的服务是如何运作的,这一点都不清楚。他们将不得不依赖单独的文档或错误消息

如果声明了您的服务所需的参数,那么对于不熟悉您的代码(即刚刚下载了WSDL)的人来说,使用您的服务会容易得多。您还可以获得开箱即用的良好验证程度

举例说明:

[OperationContract]     
DoSomethingResult DoSomething(DoSomethingContext context) 
vs

这一点主要与API的设计有关。与此无关的是,您既是服务的作者又是服务的消费者

我完全支持Kirk Broadhurst关于使用名称空间进行版本控制的建议。我用它,效果很好

编辑:再次阅读,我想我误读了你的文章。我在这里假设您的参数和返回值对象是您在所有服务中使用的一些通用对象。如果它们确实是针对每项服务的,那么这是一个很好的方法,我已经在很多场合成功地使用过。你会做得很好的