我正在评估ServiceStack作为我们想在系统环境中使用的可能的REST服务,到目前为止,我对此感到非常满意。
服务的要求是隐藏特定用户或用户组的字段。取决于用户拥有的密钥/会话
并非数据模型的所有字段都返回给客户端,它们必须被服务堆栈隐藏。因此,在接收到数据对象(列表)之后
从Linq2SQL,我用反射分析对象,提取对象成员,忽略应该隐藏的成员,然后添加其他对象
成员的字典。之后,我将字典传递给ServiceStack,由ServiceStack对其进行序列化并将数据结构发送给客户端。

我对此设置的问题是:


这是用ServiceStack做到的正确方法还是我在滥用
漏洞将很快修复?
有没有一种ServiceStack方式可以达到相同目的?
您有什么推荐的最佳做法吗?

最佳答案

使用ServiceStack的正确方法是为API目的定义DTO,而不是尝试使用现有的业务对象。如果您的客户准备分析列表,则返回具有字典属性的DTO可能会起作用。

一种“ ServiceStack”方法是使用所有可能的属性定义一个简单的,扁平的DTO,其中每个属性都是可空的。

给定DTO定义如下:

public class NullablePartials
{
    public Int32? Test1 { get; set; }
    public String Test2 { get; set; }
    public Double? Test3 { get; set; }
}


以下片段:

Dictionary<String, String> MyDtoDictionary = new Dictionary<String, String>();
MyDtoDictionary.Add("Test1", "7");
MyDtoDictionary.Add("Test2", "Value2");
NullablePartials result = MyDtoDictionary.ToJson().FromJson<NullablePartials>();

System.Diagnostics.Debug.WriteLine(MyDtoDictionary.ToJson());
System.Diagnostics.Debug.WriteLine(result.ToJson());


产生:

{"Test1":"7","Test2":"Value2"}
{"Test1":7,"Test2":"Value2"}


在默认设置中使用ServiceStack.Text作为JSON库用于序列化null。

有关最佳实践,请参见https://github.com/ServiceStack/ServiceStack/wiki/Advantages-of-message-based-web-services,其中讨论了ServiceStack哲学。特别推荐使用:


  代码优先POCO
  
  由于它促进了干净,可重用的代码的开发,因此ServiceStack一直鼓励几乎所有内容都使用代码优先POCO。即可以使用相同的POCO:
  
  
  在请求和响应DTO中(在客户端和服务器上)
  在JSON,JSV和CSV文本序列化器中
  作为OrmLite,db4o和NHibernate中的数据模型
  作为实体存储在Redis中
  作为存储在缓存和会话中的Blob
  在MQ的服务中删除并执行
  将复杂的配置脱水
  
  
  利用基于POCO的功能构建的不同技术,可提供前所未有的重用程度,减少摩擦,促进一致,更易用和更合理的代码库。

09-20 16:06