使用运营合同的好方法和坏方法。
Posted
技术标签:
【中文标题】使用运营合同的好方法和坏方法。【英文标题】:Good and bad ways to use operation contracts. 【发布时间】:2012-05-12 21:23:36 【问题描述】:您好,我一直在阅读一些讲义,但我无法弄清楚为什么要使用这种方法:
[OperationContract]
Student PostStudent (Student student);
很好。
而且这个方法不好:
[OperationContract]
void PostStudent (string firstname, string lastname etc..);
然而我实现的版本是这样的:
[OperationContract]
void PostStudent(Student student);
所以我不确定我实现的版本是否不好,我也不确定我的讲师是如何得到的
Student PostStudent (Student student);
// ?
【问题讨论】:
您能否详细说明“这种方法不好”是什么意思? 我只能看到方法是bad
,因为方法参数过多(你在...
中遗漏了多少)。您也可以挑剔它不使用驼峰式大小写作为参数名称,但除此之外并没有什么不好的地方。
我对讲师所描述的“好”实现的偏好还基于这样一个事实,即它的输入类型是Student
,而不是一堆字符串。这应该不太可能混淆每个参数的含义。但如果您稍后决定这样做,它也会阻止参数的 REST 样式 URL 映射。
@mgnoonan 正是我所说的,这就是他在幻灯片中的全部内容。我可以发布它的屏幕转储,但它正是我提到的。
@faester 我认为 url 映射是直接文档,即你不应该映射到 Student/Student.xml?
【参考方案1】:
Web 服务是基于消息的使用而构建的。 WCF 中的消息是通过编写一个类来定义的,您的 Student
类就是该类,并且 (optionally) 使用 DataContract
属性对其进行标记。这可以在该类的properties 上启用版本控制和设置各种属性(尽管后一种效果也可以使用MessageParameter 属性来实现)。
所以是的,PostStudent (string firstname, string lastname etc..)
很糟糕。
是否从该方法返回某些内容取决于您。 void
可以很好,因为例如使用 SOAP,您可以返回一个错误,指示无法创建用户的原因:没有错误意味着创建顺利。
当你想检查创建的Student时,你不妨定义一个PostStudentResult
(或PostResult<T>
)类并返回它,包含属性Student
(或T Result
)和Status
,其中第一个包含创建时的学生,后者指示创建是否成功。
【讨论】:
+1 对我来说,“好”版本的主要区别在于它是否更适合未来……它更好地处理版本控制。 msdn.microsoft.com/en-us/library/ms731060.aspx【参考方案2】:Web 服务中的返回值通常不是坏习惯。所以它是关于参数的。属于一起的数据应该包装在 Objects 中。
此外,Post 方法根本不应该获得返回值。您发布它,如果出现错误,您将收到异常。
如果您需要接收一些学生,您应该创建一个类似的方法:
Student GetStudentByName(string name);
【讨论】:
【参考方案3】:如果是 WCF,那么使用 Void 方法指定 Action 也是一个很好的做法。
【讨论】:
【参考方案4】:就像其他人所说的那样,方法参数太多是不好的做法。无论如何,我只能看到您的签名和您提到的良好签名之间的一个区别。例如,将学生对象作为返回将使您能够在数据库中添加学生的 ID。同样的事情适用于对象的任何其他计算属性。使用 void 方法将强制您再次加载对象,这意味着如果您想在发布对象后直接使用该对象,则需要额外访问服务器。如果返回对象只不过是额外的带宽,那么任何具有 void WCF 方法的方法都不错。
【讨论】:
以上是关于使用运营合同的好方法和坏方法。的主要内容,如果未能解决你的问题,请参考以下文章