【问题标题】:Do I need to expose a constructor in a WCF DataContract for it to work during object instantiation on the client?我是否需要在 WCF DataContract 中公开一个构造函数才能在客户端上的对象实例化期间工作?
【发布时间】:2011-04-30 11:31:53
【问题描述】:

我在 WCF 服务中有一个类,我们称之为 AA 是一个数据协定,其中包含另一个自定义对象 B 的集合作为其 DataMembers。为了避免客户端出现空引用问题,我在构造函数中实例化 BList,如下所示:

[DataContract]
public class A
{
    [DataMember]
    public String name { get; set; }
    [DataMember]
    public List<B> BList {get; set; }

    public A()
    {
        BList = new List<B>();  
    }
}

我的问题是,在客户端上,这种实例化不会发生,并且 BList 在客户端上创建 A 的对象后显示为 null。我猜构造函数没有出现在客户端上。那么,我是否需要让构造函数成为一个显式的操作契约?如果是这样,那会让客户看到他们不应该看到的内部事物,对吗?如何确保此实例化发生在客户端上?

谢谢,如果这看起来是个愚蠢的问题,我们很抱歉。

【问题讨论】:

    标签: c# .net wcf serialization wcf-client


    【解决方案1】:

    我不确定是否有办法做到这一点,但是通过从服务中获取新实例,应该初始化列表,我建议如下

    • 编写一个返回类的新实例的 Web 方法,您可以按以下方式使用它,我相信您的列表已初始化

    创建实例:

    A a = new ServiceClient.CreateAInstance();
    

    在服务中编写方法,

    [OperationContract]
    public A CreateAInstance()
    {
         return new A();
    }
    

    【讨论】:

    • 谢谢。这可能会奏效,但会通过让客户端调用 Web 方法来实例化对象而给客户端带来负担。
    【解决方案2】:

    您需要使用 [OnDeserializing] 或 [OnDeserialized] 属性来初始化 DataContract 类型。见http://msdn.microsoft.com/en-us/library/ms733734.aspx

    【讨论】:

    • 抱歉,刚刚看到问题比这更深 - 您希望将 BList 初始化的 行为 转移到客户端。不幸的是,没有可互操作的方式来做到这一点(XSD/WSDL/etc 不允许描述这种语义),但您当然可以共享类型(例如,将您的类型放入 MyDataContracts.dll 并执行 svcutil /r:MyDataContracts.dll ) 如果您不介意打破解决方案的真正解耦/SOA 特性...
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2017-06-18
    • 1970-01-01
    • 2019-10-21
    • 2018-01-06
    • 1970-01-01
    • 2015-03-11
    • 2014-09-23
    相关资源
    最近更新 更多