使用 ServiceStack 隐藏输出成员

本文关键字:成员 输出 隐藏 ServiceStack 使用 | 更新日期: 2023-09-27 18:33:28

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

至于最佳实践,请参阅 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 构建功能的不同技术,提供前所未有的重用水平,减少摩擦,促进一致、更可用且更易于推理的代码库。