John Isaiah Carmona
John Isaiah Carmona

Reputation: 5366

WCF Generic Class

How can this work as a WCF Service?

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

I want to expose the BusinessObject <T> class and the all the class that inherits the IEntity interface in the WCF Service.

My code is in C#, .NET Framework 4.0, build in Visual Studio 2010 Pro.

Upvotes: 2

Views: 2826

Answers (3)

x0n
x0n

Reputation: 52480

You need to register a DataContractResolver behavior with your host so WCF can (de)serialize as yet unknown types dynamically. See more information here:

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

That said, the type still needs to be closed generic type, albeit a common base class AFAIK.

Upvotes: 1

DotNetUser
DotNetUser

Reputation: 6612

KnownType attribute is a way to ensure that the type data for the contract is added to the wsdl metadata. This only works for classes it will not work for an interface. An interface cant store data and is not univerally understood by all languages out there so its not really exposable over wcf. See this here- http://social.msdn.microsoft.com/forums/en-US/wcf/thread/7e0dd196-263c-4304-a4e7-111e1d5cb480

Upvotes: 2

chandmk
chandmk

Reputation: 3481

While exposing BusinessObject to the clients via WCF, you must do that by using closed generic type.

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

Upvotes: 6

Related Questions