什么是面向服务的体系结构定义方法签名服务呼叫的最佳做法是什么?(What is the best p

2019-09-21 06:36发布

什么是定义服务呼叫原型/签名,而在开发面向服务的架构应用的最佳实践。

比如我想创建服务电话发送电子邮件。

让说我有以下对象在我的领域层

 [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}

我扶着向着第一个选项。(说到这我知道,如果对象是方式复杂得多,它是有意义的传递整个对象本身。)

Answer 1:

不幸的是,第二个选项是在这种情况下,不太清楚,这是因为你的Email class

假设我打电话给你的方法。 你让我传递的一个实例Email类。 我去产合同,并找到7种性质。

而且,我怎么知道哪些参数是必需的,哪些是可选的? 从文档? 没有一个干净的设计,如果我要咨询的文档,以合理利用API的。

我宁愿重构你的Email类来调用它EmailRequest删除了所有这些可选参数,然后我会创造的又一个类别EmailResponse如果你需要使用它作为服务的返回值。



Answer 2:

我也投票支持方法#2。

既然你提到的“面向服务架构”,你应该创建一个DataContract获得一个什么样的客户端看到的完全控制。

在这里,系列化是选择加入,所以“未使用的属性”将不会通过线路发送。

另外,你喜欢控制序列成员的顺序,如果需要的字段与否,自定义名称,版本等指定其他好处。 它只是使事情明显的客户。

此外, DataContractSerializer是比快据说10% XmlSerializer 。 有关更多细节这个博客,虽然我不知道,如果方法#1(基本类型)将使用XmlSerializerDataContractSerializer

[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;}    
}


Answer 3:

它总是最好去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}}


Answer 4:

如何写两者兼而有之? 而只是具有第一,拨打第二个?



Answer 5:

我将使你的Email画线A [DataContract],并选择走二里。 这是我的,你不想为一个服务方法,许多参数的意见。



Answer 6:

SOA的一个重要方面是合同,所以我真的会投票反对与不需要的数据和细节,这将导致其性能下降速度快(ER)弄乱了。

通过channs提供的选项,因为它专注于定义明确的合同,并在细节还不错,但我也想分开,用于合同目的从内部用于分离和隐藏内部实现细节(我详细解释这个班的班在边缘组件图案)



文章来源: What is the best practice to define method signature in Service oriented architecture for service call?