我正在使用带有一组WCF服务的DI模式,Unity充当我的IoC容器。我已经从服务中完成了单元和功能测试,一切都按照我的预期运行。我现在正在测试端点,我遇到了序列化结果的问题。
我的服务看起来像这样:
public class ProcessingService : IProcessingService
{
private IOrderService orderService;
public ProcessingService(IOrderService orderService)
{
this.orderService = orderService;
}
[WebInvoke(Method = "Get", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public IOrder CreateNewOrder(string venNum, OrderType orderType, string orderDescription, string createdBy)
{
return orderService.CreateNewOrder(venNum, orderType, orderDescription, createdBy);
}
}
orderService.CreateNewOrder
最终会返回一个与此
internal partial class Order : IOrder
{
[DataMember]
public int VenNum { get; set; }
[DataMember]
public string Description { get; set; }
[DataMember]
public IList<string> RuntimeErrorMessages { get; set; }
[DataMember]
public IList<IOrderDetail> OrderDetails { get; set; }
}
这会产生异常:
“
<type>
不是预期的。考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到已传递的已知类型列表中到DataContractSerializer。“
此错误有意义,因为您无法序列化或反序列化接口。此外,我可以通过将我的服务方法的返回类型更改为
来消除此错误public Order CreateNewOrder(...)
我不想暴露我的具体物品,所以我在这里陷入了一些僵局。在过去,我可以回忆一下,使用Json.Net的JsonConverter类来序列化和反序列化这样的对象,虽然我当时没有使用DI,但它更容易一些。那么如何在不暴露我的具体类型的情况下序列化我的复杂类型呢?例外提到使用DataContractSerializer,但似乎我必须为我想要返回的每个复杂类型编写一个Serializer,这是不切实际的。
建议非常感谢!
答案 0 :(得分:4)
减少耦合的愿望值得称赞,但at the boundary, an application is no longer object-oriented。特别是对于WCF应用程序,边界由XSD和WSDL定义,因此通过线路传输的数据不再是对象,而是XML(或者至少是XML信息集)。该数据没有任何行为。
SOAP服务与其客户端之间的耦合由合同定义;即WSDL。即使您可以在实现中返回接口,它仍然会以XML的形式通过网络传输,因此它没有任何区别。
答案 1 :(得分:0)
如上所述,这与序列化和I'd like to quote another answer:
之外的任何事情无关没有。您无法序列化界面。如初。
你必须序列化一个具体的类,合同必须是一个具体的类。如果愿意,可以使用DTO
对象。 Also this blog post might be interesting,它通过DTOs
和POCOs
解决了一些概念上的差异和困难。