WCF,依赖注入和序列化

时间:2015-10-28 15:30:18

标签: c# wcf dependency-injection unity-container

我正在使用带有一组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,这是不切实际的。

建议非常感谢!

2 个答案:

答案 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,它通过DTOsPOCOs解决了一些概念上的差异和困难。

相关问题