使用 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 构建功能的不同技术提供了前所未有的重用水平,减少了摩擦,促进了一致、更可用和更容易解释代码库。