首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建api契约的正确方法

创建api契约的正确方法
EN

Software Engineering用户
提问于 2015-06-18 16:34:04
回答 1查看 1.4K关注 0票数 1

我需要以下方面的帮助:

我正在尝试设计一个API。以下是创建合同的两种方法:

方法1:

代码语言:javascript
复制
public class MyController
{
  public void MyAction1(Dictionary<string, dynamic> input)
  {
    //Use input like below
    //Read from input dictionary and apply minimal business logic if needed
    //And Call CustomDataProvider library with input object itself(DataProvider designed in such a way that it takes Dictionary and used values as procedure input. Dictionary key is same as procedure arguments.)
  }

public void MyAction2(Dictionary<string, dynamic> input)
  {
    //Use input like below
    //Read from input dictionary and apply minimal business logic if needed
    //And Call CustomDataProvider library with input object itself(DataProvider designed in such a way that it takes Dictionary and used values as procedure input. Dictionary key is same as procedure arguments.)
  }
}

在这种情况下,我们根本不需要数据契约。

办法2:

代码语言:javascript
复制
public class MyController
{
  public void MyAction1(MyContractBusinessObject1 input)
  {
    //Do normal business logic processing using input object and call DBProvider by creating a dictionary from business object
  }


public void MyAction2(MyContractBusinessObject2 input)
  {
    //Do normal business logic processing using input object and call DBProvider by creating a dictionary from business object
  }
}

在这种情况下,我们将有不同的业务类作为契约,用于不同的操作输入。请您建议上述哪一种方法更好,为什么?

让我举一个例子。假设我的操作正在进行登录和创建新帐户。在第一种情况下,输入将是

代码语言:javascript
复制
new Dictionary<string, dynamic>{{"Name","myname"},{"Passowrd",'mypassword'}}

代码语言:javascript
复制
new Dictionary<string, dynamic>{{"Name","myname"},{"Passowrd",'mypassword'},{"Age",myage},{"otherInfo",myotherinfo}}

但是在方法2中,输入将是

代码语言:javascript
复制
 class Login{
    public string Name{get; set;}
    public string Password{get; set;}
} 

代码语言:javascript
复制
class NewAccount{
public string Name{get; set;}
public string Password{get; set;}
public int Age{get; set;}
public OtherInfo OtherInfo{get; set;}
}
EN

回答 1

Software Engineering用户

发布于 2015-06-18 18:37:11

我将在这里假设以下几点:

  • 您正在寻找适用于多个控制器的模式
  • 在这种情况下,单个操作调用可以提交不同数量的数据(名称/密码保证,但有时还包括年龄和其他信息)。

如果我的假设是正确的,那么我会向以下方面提出一些建议。

代码语言:javascript
复制
public class Contact
{
    public String FirstName { get; set; }
    public String LastName { get; set; }
}

public class SpecialContact : Contact
{
    public String Title { get; set; }
}

public class AnotherSpecialContact : Contact
{
    public String Phone { get; set; }
}

public class ContactController
{
    public void MyAction(Contact contact)
    {
        // VALIDATE: Example validation provided.
        if (String.IsNullOrWhiteSpace(contact.FirstName)) { return; }
        if (String.IsNullOrWhiteSpace(contact.LastName)) { return; }

        if (contact is SpecialContact)
        {
            SpecialContact specialContact = contact as SpecialContact;
            // Do things SpecialContact specific.
        }
        else if (contact is AnotherSpecialContact)
        {
            AnotherSpecialContact anotherSpecialContact = contact as AnotherSpecialContact;
            // Do things AnotherSpecialContact specific.
        }

        // Do things Contact specific.
    }
}

我提出建议的理由:

  • 作为API开发人员,您知道您需要的数据在那里,并且可以进行简单的验证来确保。如果是字典或动态类型,则必须在常规验证的基础上进行类型验证。
  • 正如您可以从SpecialContactAnotherSpecialContact示例中看到的那样,您可以扩展操作以处理存在额外数据的特殊情况。如果存在数据较少的情况,则意味着您有错误的基类(即本场景中的Contact )。
  • (有点像#1的重复,但是.)您使用的是静态类型的语言,那么为什么要用dynamic来反对呢?唯一一次我发现动态特别有用的是在反射的情况下,任何其他的时候,我发现它是相同的或更多的工作作为替代。如果您认为您需要dynamic,那么首先尝试一下Object
票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/287216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档