WCF Общий класс - PullRequest
       12

WCF Общий класс

2 голосов
/ 25 января 2012

Как это может работать как служба WCF?

public class BusinessObject<T> where T : IEntity
{
    public T Entity { get; set; }

    public BusinessObject(T entity)
    {
        this.Entity = entity;
    }
}

public interface IEntity { }

public class Student : IEntity
{
    public int StudentID { get; set; }
    public string Name { get; set; }
}

Я хочу предоставить класс BusinessObject и все классы, которые наследуют интерфейс IEntity в службе WCF.

Мой код на C #, .NET Framework 4.0, сборка в Visual Studio 2010 Pro.

Ответы [ 3 ]

6 голосов
/ 25 января 2012

Представляя BusinessObject клиентам через WCF, вы должны сделать это с помощью закрытого универсального типа.

[DataContract]
public class BusinessObject<T> where T : IEntity
{
    [DataMember]
    public T Entity { get; set; }

    public BusinessObject(T entity)
    {
        this.Entity = entity;
    }
}  

[ServiceContract]
interface IMyContract {
[OperationContract]
BusinessObject<Student> GetStudent(...) // must be closed generic
}
2 голосов
/ 25 января 2012

Атрибут KnownType - это способ обеспечить добавление данных типа для контракта в метаданные wsdl.Это работает только для классов, это не будет работать для интерфейса.Интерфейс не может хранить данные и не является универсально понятным для всех языков, поэтому он не доступен для просмотра через wcf.Смотрите это здесь - http://social.msdn.microsoft.com/forums/en-US/wcf/thread/7e0dd196-263c-4304-a4e7-111e1d5cb480

1 голос
/ 25 января 2012

Вам необходимо зарегистрировать поведение DataContractResolver на вашем хосте, чтобы WCF мог (де) сериализовать пока еще неизвестные типы динамически. Подробнее смотрите здесь:

http://msdn.microsoft.com/en-us/library/ee358759.aspx

Тем не менее, тип все еще должен быть закрытым универсальным типом, хотя это общий базовый класс AFAIK.

...