Внедрение ковариации в службу отдыха WCF - PullRequest
1 голос
/ 31 января 2011

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

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

Контракт операции WCF имеет входной параметр A. Я должен иметь возможностьпередайте также и этот шаг B.

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

Возможно ли, я реализую концепцию ковариации.Как я должен сделать это на сервере и клиенте.Просьба помочь.

1 Ответ

2 голосов
/ 03 февраля 2011

Конечно!Единственное, что требуется для этого, - это добавить класс 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 и из нее, однако единственное, что вы не сможете сделать, это указать интерфейс в качестве ответа в вашем контракте.

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

...