如何在单个对象中继承三个数据协定?

时间:2012-11-27 06:19:57

标签: wcf datacontracts

如何调用三个数据协定对象并在单个对象中创建它?

我有像这样的数据合约类

 [Serializable]
    [DataContract]
    public class Address
    {
        [DataMember]
        public long AddressId { get; set; }
}

另一个数据合约类,如

 [Serializable]
    [DataContract]
    public class Email
    {
        [DataMember]
        public long EmailId { get; set; }
    }

另一个数据合约类,如

[Serializable]
    [DataContract]
    public class Phone
    {
        [DataMember]
        public long PhoneId { get; set; }
    }

现在我想以相同的方法使用AddressId,EmailId,PhoneId。

怎么可能?

2 个答案:

答案 0 :(得分:1)

仅保留[DataContract] attrubute,您也不需要使用Serializable进行装饰

嗯,WCF数据合同有以下选项:

复合数据合约。

标记为DataMember的任何类的成员字段一旦用DataContract属性修饰,也可以是数据合同。所有嵌套数据协定的聚合说明了数据协定本质上是递归的。 WCF会检测对象图中所有数据合约启用属性,并捕获它们的状态。

[DataContract]
class Address
{
    [DataMember]
    public long AddressId { get; set; }
}

// The same for the rest two, and then an aggregating type.

[DataContract]
class Contact
{
    [DataMember]
    public Address Address {get;set;} // here we go

    [DataMember]
    public Email Email {get;set;}

    [DataMember]
    public Phone Phone {get;set;}
}

数据合约层次结构

您的数据协定类可能是另一个数据协定类的子类,在这里您只需要明确选择给定的数据协定,即在层次结构树中为每个类型指定DataContract。

[DataContract]
class ContactDetails
{
    [DataMember]
    public long AddressId { get; set; }

    // you could move the phone and email details here too.
}

[DataContract]
class Contact : ContactDetails
{
    [DataMember]
    public string Name { get; set; }
}

您不能为每个类分别创建三个类,并在.Net中一次性继承它们。我的建议是第一个案例 - 即数据合同聚合。

奖励:多态类型参考。

在基类型上应用[KnownType(Type type)]属性,以将多态对象作为操作契约参数传递。这肯定不是你的情况。

答案 1 :(得分:0)

应用于类的合同为您的服务提供服务元数据(服务类只能将修饰的类用作服务方法中的参数类型)。所以 - 如果你想从现有的属性中组合一些类型(类) - 这与WCF契约无关。