繁体   English   中英

WCF,依赖注入和序列化

[英]Of WCF, Dependency Injection, and Serialization

我正在将DI模式与一组WCF服务一起使用,而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,这是不实际的。

建议非常感谢!

减少耦合的愿望值得称赞,但是在边界上,应用程序不再是面向对象的 特别是对于WCF应用程序,边界是由XSD和WSDL定义的,因此,通过网络传输的数据不再是对象 ,而是XML(或至少是XML信息集)。 该数据没有任何行为。

SOAP服务与其客户端之间的耦合由合同定义; 即WSDL。 即使您可以在实现中返回接口,它也仍然会以XML的形式在网络上传输,因此没有任何区别。

如上所述,这与序列化无关, 我想引用另一个答案:

不可以。您不能序列化接口。 永远。

您必须序列化一个具体的类,并且合同必须是一个具体的类。 DTO对象(如果愿意)。 同样,此博客文章可能会很有趣,它经历了DTOsPOCOs一些概念差异和困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM