Полиморфизм в WCF

Существует возможность отменить регистрацию, которая проходит как отдельная регистрация.

Но я бы посоветовал действовать осторожно и читать.

https://www.atlassian.com/git/tutorials/undoing-changes/git-revert

Также я надеюсь, что вы понимаете разницу в «ребазе А на В» и "объединить A с B"

Я бы посоветовал, если вы делаете rebase, пожалуйста, обновите источник master на локальном компьютере (это мой трюк - держать все под контролем, я не знаю, стандартно ли это )

13
задан 25 March 2009 в 13:22
поделиться

1 ответ

Ваш пример не скомпилирует, потому что интерфейсы не могут содержать поля, который является, каковы ObjectID, StringOne и StringTwo. Что Вы пытаетесь определить с IObject, IOne, и ITwo является контрактом данных, не контрактом на обслуживание. По сути, необходимо использовать атрибут DataContract, не атрибут ServiceContract и классы, не интерфейсы.

[DataContract]
[KnownType(typeof(MyOne))]
[KnownType(typeof(MyTwo))]
public class MyObject
{
    [DataMember]
    Guid ObjectID;
}
[DataContract]
public class MyOne : MyObject
{
    [DataMember]
    String StringOne;
}
[DataContract]
public class MyTwo : MyObject
{
    [DataMember]
    String StringTwo;
}

Заметьте, что это классы, не интерфейсы. Атрибут DataContract заменил атрибут ServiceContract. Атрибут KnownType заменил атрибут ServiceKnownType. Это более канонически от того, что я видел.

Ваш контракт на обслуживание был бы затем определен как это:

[ServiceContract]
public interface IConnection
{
    [OperationContract]
    [ServiceKnownType(typeof(MyOne))]
    [ServiceKnownType(typeof(MyTwo))]
    MyObject RetrieveObject(Guid ObjectID);

    [OperationContract]
    [ServiceKnownType(typeof(MyOne))]
    [ServiceKnownType(typeof(MyTwo))]
    Guid StoreObject(MyObject NewObject);
}

Можно поместить атрибуты ServiceKnownType в уровень контракта (т.е. под атрибутом ServiceContract), чтобы иметь его относятся ко всем операциям контракта.

[ServiceContract]
[ServiceKnownType(typeof(MyOne))]
[ServiceKnownType(typeof(MyTwo))]
public interface IConnection
{
    [OperationContract]
    MyObject RetrieveObject(Guid ObjectID);

    [OperationContract]
    Guid StoreObject(MyObject NewObject);
}

Можно использовать интерфейсы в контрактах данных как это:

interface IEmployee
{
    string FirstName
    { get; set; }
    string LastName
    { get; set; }
}
[DataContact]
class Employee : IEmployee
{...}

Однако интерфейс IEmployee не включен в экспортируемые метаданные. Таким образом, если Вы будете использовать svcutil для генерации прокси-классов, то клиенты не будут знать о IEmployee. Это не грандиозное предприятие, если Ваш сервис и клиент находятся в том же приложении (который является хорошим способом связаться между доменами приложения). Однако, если Ваш клиент будет отдельным от Вашего сервиса (в подавляющем большинстве случаев, то это будет), это становится проблематичным, потому что необходимо будет копировать интерфейс IEmployee на клиентском вручную.

18
ответ дан 1 December 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: