2015-12-10 29 views
1

注意:我不确定this question是否回答我的问题,以防您将其标记为重复。处理REST API中的只读属性

我正在使用的REST API有一个创建新的Person的方法。所以,我送我的Person类的序列化版本,它(在POST要求):

public class Person 
{ 
    public long Id; 
    public string Name; 
    public string Surname; 
} 

的问题是,Id是一个只读的值,API返回一个错误,说“你是不是允许为Id设置一个值“,这非常合理。而且据我们所知,当我们创建上述类的新实例时,Id将被设置为零。所以API会认为我为Id指定了一个值。

如何修改我的课,这样我可以用它既能

  1. 创建一个新的Person
  2. 获取所有Person s的列表/以获取特定PersonId

+0

为什么不从查询中分割命令(CQS)。这样你的合同只包含真正需要的东西。 –

+0

什么是您正在使用的REST API框架? – Michael

+0

你的代码没有说'Id'是只读的。你能告诉我们实际的代码吗? –

回答

0

你的实体类应该是这样的。

public class Person 
{ 
    public int? Id {get;set;};//you can use long if you want 
    public string Name {get;set;}; 
    public string Surname {get;set;}; 
} 

然后,您需要一个存储库类来处理Add/Update/GetAll/Delete类操作。如果您熟悉存储库模式,请在此处使用它们。

public class PersonRepository 
{ 
    public void Add(Person person) 
    { 
     //your add customer method 
    } 

    public List<Person> GetAll() 
    { 
     //your get all persons method 
    } 

    public Person GetPerson(int id) 
    { 
     //your get person method 
    } 
} 
+0

是的。但是,当我使用Add函数时,Id将被设置为零,并且API会发出抱怨。不是吗? – Disasterkid

+0

好的。很公平。然后使用Nullable int。看到我更新的答案。所以你可以发送'null'给'Id'。 –

0

我会认为API应该能够处理这个。使用0来表示新实体的“没有价值”是非常合理的。

另一种选择是使用Nullable<int>作为Id,在这种情况下NULL会指示“没有数值”。

(另外,你应该使用属性而不是域)

public class Person 
{ 
    public int? Id { get; set; } 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 

不过,我不认为这是比只用0一个更好的选择。

如果API不断抱怨(I.E.也不会接受NULL的值),那么您可以定义一个新类来添加一个新人。

public class NewPerson 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
} 
+0

奇怪的是,这个API再次抱怨值为null!显然它希望请求没有一个Id参数开始。 – Disasterkid