我使用返回 List 的 ServiceStack 创建了一个 Web 服务<SyncUserDTO>
。它有更多属性,但我将其简化为一个字段,时间戳。
[DataContract]
public class SyncUserDTO
{
public SyncUserDTO()
{
Timestamp = new TimestampDTO();
}
[DataMember(Order = 1)]
public TimestampDTO Timestamp { get; set; }
}
[DataContract]
public class TimestampDTO
{
[DataMember]
public bool DataValid { get; set; }
[DataMember]
public DateTime? Value { get; set; }
}
该服务似乎可以完美运行(与其他测试一起使用),但是当我创建客户端控制台应用程序并添加服务引用时,SyncUserDTO 没有构造函数,这意味着这不起作用:
static void SendUsersServiceReference()
{
var users = new List<SyncUserDTO>();
for (var i = 0; i < 5; i++)
{
var user = new SyncUserDTO();
user.Timestamp.Value = DateTime.Now; // NullReferenceException,
user.Timestamp.DataValid = true; // as Timestamp is null
}
}
在 SyncUserDTO 上按 F12 时,我似乎在 Reference.cs 中找不到任何 Constructor 方法,这解释了为什么上面不起作用。
但是为什么没有在客户端应用程序的代理类中创建构造函数?
我需要自己在客户端中进行“构建”,然后它就可以工作了:
var user = new SyncUserDTO() { Timestamp = new TimestampDTO() };
当然,我不希望使用我的服务的人必须自己创建它。他们应该真正注意底层的 TimestampDTO。构造函数应该这样做。
顺便说一句,我在 Google 和 SO 中搜索了诸如“构造函数未在具有添加服务引用的代理类中创建”之类的术语,有和没有“ServiceStack”,没有任何结果可以帮助我完成这个任务......
pps。Demis (ServiceStack),如果你正在阅读这篇文章,是的,SOAP 即将淘汰,REST 是新的黑色——但我想同时支持这两者,看起来 ServiceStack 确实如此,这真的很棒。我喜欢 ServiceStack :D