什么是定义服务呼叫原型/签名,而在开发面向服务的架构应用的最佳实践。
比如我想创建服务电话发送电子邮件。
让说我有以下对象在我的领域层
[datacontract]
public class Email
{
public string To { get; set; }
public string From { get; set; }
public string Message { get; set; }
public string Subject { get; set; }
//I am not going to use this properties in send email method
public string OtherProp1 {get; set;}
public string OtherProp2 {get; set;}
public string OtherProp3 {get; set;}
}
我应该像创建服务方法签名
public bool SendEmail(string from,string to, string subject,string message){//My Logic}}
要么
public bool SendEmail(Email myEmail){//My Logic}
我扶着向着第一个选项。(说到这我知道,如果对象是方式复杂得多,它是有意义的传递整个对象本身。)
不幸的是,第二个选项是在这种情况下,不太清楚,这是因为你的Email class
。
假设我打电话给你的方法。 你让我传递的一个实例Email
类。 我去产合同,并找到7种性质。
而且,我怎么知道哪些参数是必需的,哪些是可选的? 从文档? 没有一个干净的设计,如果我要咨询的文档,以合理利用API的。
我宁愿重构你的Email类来调用它EmailRequest
删除了所有这些可选参数,然后我会创造的又一个类别EmailResponse
如果你需要使用它作为服务的返回值。
我也投票支持方法#2。
既然你提到的“面向服务架构”,你应该创建一个DataContract
获得一个什么样的客户端看到的完全控制。
在这里,系列化是选择加入,所以“未使用的属性”将不会通过线路发送。
另外,你喜欢控制序列成员的顺序,如果需要的字段与否,自定义名称,版本等指定其他好处。 它只是使事情明显的客户。
此外, DataContractSerializer
是比快据说10% XmlSerializer
。 有关更多细节这个博客,虽然我不知道,如果方法#1(基本类型)将使用XmlSerializer
或DataContractSerializer
。
[DataContract(Name="MyEmail", Namespace="http://contoso.org/soa/datacontracts")]
public class Email
{
[DataMember(Name="ToField", IsRequired=true, Order=0]
public string To { get; set; }
[DataMember(Name="FromField", IsRequired=false, Order=1]
public string From { get; set; }
[DataMember(Name="MessageField", IsRequired=true, Order=2]
public string Message { get; set; }
[DataMember(Name="SubjectField", IsRequired=false, Order=3]
public string Subject { get; set; }
public string OtherProp1 {get; set;}
public string OtherProp2 {get; set;}
public string OtherProp3 {get; set;}
}
它总是最好去OOP方式。 如果邮件类是过度的,试图分析和定义其他的解决方案。 像这样
public class Email
{
//everything needed for service is extracted in another class
public EmailAddressDetails {get;set}
//I am not going to use this properties in send email method
public string OtherProp1 {get; set;}
public string OtherProp2 {get; set;}
public string OtherProp3 {get; set;}
}
和使用这样的服务
public bool SendEmail(EmailAddressDetails email){//My Logic}}
如何写两者兼而有之? 而只是具有第一,拨打第二个?
我将使你的Email
画线A [DataContract],并选择走二里。 这是我的,你不想为一个服务方法,许多参数的意见。
SOA的一个重要方面是合同,所以我真的会投票反对与不需要的数据和细节,这将导致其性能下降速度快(ER)弄乱了。
通过channs提供的选项,因为它专注于定义明确的合同,并在细节还不错,但我也想分开,用于合同目的从内部用于分离和隐藏内部实现细节(我详细解释这个班的班在边缘组件图案)
文章来源: What is the best practice to define method signature in Service oriented architecture for service call?