2013-08-30 2 views
0

Название довольно понятно.Как игнорировать DataMember из суперкласса в подклассе

У меня есть базовый WCF DataContract, назовем его PersonContract, который охватывает все поля объекта Person в моей базе данных.

У меня есть несколько клиентских приложений, которые вызывают одну и ту же услугу через конечные точки различных интерфейсов, реализованных этой службой. Это связано с тем, что (среди других различий) я хочу, чтобы каждое из этих приложений имело возможность доступа и редактирования только определенного подмножества объекта Person.

Теперь, если я хочу определить контракт со всеми свойствами PersonContract за исключением одного, могу ли я подкласса PersonContract и игнорировать одно свойство в подклассе? Или мой единственный вариант построения контрактов из самого маленького подмножества (но я сомневаюсь, что могу полностью избежать повторения кода)?

ответ

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; } 
} 

И я проверил, что результаты, как я бы ожидать.

+0

Теперь мне немного стыдно, что я сам не экспериментировал, так что спасибо. К сожалению, наследование их с нуля создало бы неинтуитивное дерево наследования, и я бы не хотел, чтобы изменения в каком-либо контракте, кроме «полного», подразумевали изменения в других. Поэтому, я думаю, я просто скопирую их в целях безопасности и предсказуемости. –