2011-01-31 3 views
1

Может ковариационной концепция будет реализована в WCF службы отдыха,ковариации implementaion в WCF отдыха службы

т.е., у меня есть класс A и B наследует от него.

Рабочий контракт WCF имеет входной параметр A. Я должен быть в состоянии передать B также на этот уровень.

У меня есть клиент JSON, который обращается к моему сервису отдыха на EXF.

Возможно ли реализовать концепцию ковариации. Как это сделать на сервере и клиенте. Помощь Pls.

ответ

2

Конечно! Единственное, что требуется для этого, - это добавить класс B в список типов, которые служба должна знать об использовании атрибута ServiceKnownType.

Вот краткий пример, который я поставил вместе, чтобы продемонстрировать это, представьте себе, это ваш контракт на обслуживание:

using System.Runtime.Serialization; 
using System.ServiceModel; 

namespace WcfCovariance 
{ 
    [ServiceKnownType(typeof(Employee))] 
    [ServiceContract] 
    public interface IService1 
    { 
     [OperationContract] 
     Person GetPerson(); 

     [OperationContract] 
     Person PutPerson(Person person); 
    } 

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

    [DataContract] 
    public class Employee : Person 
    { 
     [DataMember] 
     public double Salary { get; set; } 
    } 
} 

И реализация:

namespace WcfCovariance 
{ 
    public class Service1 : IService1 
    { 
     static Person Singleton = new Person { Name = "Me" }; 

     public Person GetPerson() 
     { 
      return Singleton; 
     } 

     public Person PutPerson(Person person) 
     { 
      Singleton = person; 

      return Singleton; 
     } 
    } 
} 

Потому что вы сказали WCF о типе Employee используя атрибут ServiceKnownType, когда он встречается (как во входных параметрах, так и в ответ), он сможет сериализовать/десериализовать его, используя JSON или нет.

Вот простой клиент:

using System; 
using WcfCovarianceTestClient.CovarianceService; 

namespace WcfCovarianceTestClient 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var client = new Service1Client("WSHttpBinding_IService1"); 

      // test get person 
      var person = client.GetPerson(); 

      var employee = new Employee { Name = "You", Salary = 40 }; 
      client.PutPerson(employee); 

      var person2 = client.GetPerson(); 

      // Employee, if you add breakpoint here, you'd be able to see that it has all the correct information 
      Console.WriteLine(person2.GetType()); 

      Console.ReadKey(); 
     } 
    } 
} 

Очень часто, чтобы пройти подтипы и от службы WCF, единственное, что вы не сможете сделать, хотя это указать интерфейс в качестве ответа на ваш контракт.

Надеюсь, это поможет.

Смежные вопросы