使用ServiceStack隐藏输出成员

时间:2013-10-01 07:05:01

标签: c# .net rest servicestack

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

我对此设置的疑问是:

  • 这是使用ServiceStack执行此操作的正确方法,还是我滥用了 漏洞将很快修复?
  • 有没有ServiceStack方法来实现同样的目标?
  • 您可以推荐哪些最佳做法?

1 个答案:

答案 0 :(得分:3)

使用ServiceStack执行此操作的正确方法是为API的目的定义DTO,而不是尝试使用现有的业务对象。如果您的客户准备解析列表,则返回带有字典属性的DTO可以正常工作。

一种'ServiceStack'方法是定义一个简单,平坦的DTO,其中包含所有可能的属性,其中每个属性都是Nullable。

鉴于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库来序列化空值。

关于最佳实践,请参阅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为基础,提供前所未有的重复使用水平,减少摩擦,促进一致,更实用,更易于理解的代码库。