如何忽略子类中超类的DataMember

时间:2013-08-30 10:56:40

标签: wcf inheritance subclass datacontract superclass

标题非常明显。

我有一个基本WCF DataContract,我们称之为PersonContract,它涵盖了我数据库中Person实体的所有字段。

我有许多客户端应用程序通过该服务实现的不同接口的端点调用相同的服务。这是因为(除了其他差异)我希望每个应用程序只能访问和编辑Person实体的特定子集。

现在,如果我想要定义除{1}之外的PersonContract的所有属性的契约,我可以将PersonContract子类化并忽略子类中的单个属性吗? 或者是我唯一的选择从最小的子集构建合同(但我怀疑我可以完全避免重复代码)?

1 个答案:

答案 0 :(得分:1)

出于好奇,我做了几次测试,看起来它不会起作用。

以下是我使用的数据合约:

[DataContract]
public class Person
{
    [DataMember]
    public virtual string FirstName { get; set; }

    [DataMember]
    public virtual string MidName { get; set; }

    [DataMember]
    public virtual string LastName { get; set; }
}

[DataContract]
public class Person2 : Person
{
    [IgnoreDataMember]
    public override string MidName { get; set; }
}

我的服务合同:

public interface IService1
{
    [OperationContract]
    Person GetPerson();

    [OperationContract]
    Person2 GetPerson2();
}

两个操作都返回相同的结果。

您可能能够生成您正在寻找的结果的另一种方法可能是定义您的最小合同(缺少排除属性的合同)并继承它添加其他操作所需的字段。

等效数据合同看起来像:

[DataContract]
public class Person2 : Person
{
    [DataMember]
    public virtual string MidName { get; set; }
}

[DataContract]
public class Person
{
    [DataMember]
    public virtual string FirstName { get; set; }

    [DataMember]
    public virtual string LastName { get; set; }
}

我已经确认结果与我期望的一样。