Kategori: WCF

WCF KnownType Attribute

Aşağıda ki gibi bi class yapısında wcf Service Interface’nin de sadece person nesnesini belirttiğinizde, istemci tarafında student ve teacher nesnelerini göremeyeceksiniz. Bunun çözümü ise KnownType attribute ile yapılabilir.

[DataContract] 
public abstract class Person
	{
		[DataMember]
		public int Code { get; set; }
 
		[DataMember]
		public string Name { get; set; }
	}

[DataContract]  
public class Student : Person
	{
		[DataMember]
		public int StudentId { get; set; }
	}

[DataContract]
public class Teacher : Person
	{
		[DataMember]
		public int TeacherId { get; set; }
	}

Çözümü için farklı yöntemleri bulunmaktadır. Ben 2 farklı çözümünü belirtieceğim.

  • Abstract class üzerine knownType Attribute ekleyerek.
[DataContract]
 [KnownType( typeof( Student ) )]
 [KnownType( typeof(Teacher) )]
 public abstract class Person
 {
     [DataMember]
     public int Code { get; set; }
 
     [DataMember]
     public string Name { get; set; }
 }
  • Interface üzerine Helper yazarak
[ServiceKnownType("GetKnownTypes", typeof(Helper))]
[ServiceContract()]
public interface IShop
{
	[OperationContract]
	List<Person> GetPersonList();
}
static class Helper
{
	public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
	{
		knownTypes.Add(typeof(Student);
		knownTypes.Add(typeof(Teacher);
		return knownTypes;
	}
}

İstersek person classından türeyen her class için knownTypes listesini runtime oluşturabiliriz.

static class Helper
{
	public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)
	{
		Assembly assembly = Assembly.GetAssembly(typeof(Person));
		List<Type> types = assembly.GetExportedTypes().Where(e => e.BaseType == typeof(SurrogateLibrary.Form)).ToList();

		return types;
	}
}

 

Kaynak:

https://msdn.microsoft.com/en-us/library/system.servicemodel.serviceknowntypeattribute.aspx