Необходимость разделения DataContracts и ServiceContract в WCF - PullRequest
1 голос
/ 16 июня 2011

Visual Studio 2010 по умолчанию генерирует следующее при попытке создать новый проект WCF.Существует интерфейс для определения метонов (контракты операций в терминах WCF) и эксклюзивный класс, который определяет данные, которые будет использовать определение контракта на обслуживание.

namespace iAMProxyService
{
    // NOTE: If you change the interface name "IService1" here, you must also update the reference to "IService1" in Web.config.
    [ServiceContract]
    public interface IProxyService
    {

        [OperationContract]
        string GetData(int value);

        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);

        // TODO: Add your service operations here
    }


    // Use a data contract as illustrated in the sample below to add composite types to service operations.
    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }
}

Теперь мне интересно, может ли DataContract помочьуменьшить любую зависимость между клиентом и сервером.То есть я чувствую, что когда я изменяю контракт данных, мне не нужно перекомпилировать клиентский код, как если бы у него был только интерфейс (контракт на обслуживание).Правильно ли мое предположение или я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 16 июня 2011

ServiceContract определяет операции и сообщения, которые эти операции потребляют и возвращают

DataContract определяет сериализацию из объекта .NET в XML

DataContracts используются в ServiceContracts для описания XML сообщения в терминах его класса сериализации

Поэтому, если вы измените DataContract, это повлияет на сообщение, которое клиент должен отправить или получить взамен - это может быть критическим изменением для клиента.

Однако DataContractSerializer - очень простительный сериализатор (некоторые могут сказать, что он слишком прощающий). Если отправитель отправляет данные, которые получатель не ожидает, то сериализатор игнорирует эти данные. Если отправитель не отправляет данные, ожидаемые получателем, тогда, пока данные не помечены как IsRequired = true в DataContract, тогда получатель просто по умолчанию принимает значение (например, 0 для целого числа)

Таким образом, если изменение является критическим изменением для клиента, который либо вызывает сбой сериализатора, либо вызывает нежелательные побочные эффекты от сериализатора, вам придется сменить клиента. Если нет, то клиент может продолжать работать без изменений

1 голос
/ 16 июня 2011

Когда вы программируете на интерфейс, реализация может измениться, если она все еще реализует интерфейс, и вам не нужно будет перекомпилировать клиентов. Тем не менее, похоже, что вы пытаетесь изменить интерфейс для DataContract. Если вы измените это, вам (скорее всего) придется перекомпилировать. Я говорю, скорее всего, потому что технически вы можете добавить к нему, и он не должен ничего ломать (но он не придерживается строгого соответствия схемы).

Вот статья о ломающихся и неразрывных изменениях:

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

и лучшие практики, которые делают это:

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

и, наконец, учебник о том, что такое DataContract и как его использовать:

http://www.wcftutorial.net/Data-Contract.aspx

DataContract расширяет ваш уровень обслуживания. Это еще один интерфейс, с которым вы работаете. Следовательно, вам нужно следовать тем же типам правил с DataContract, что и другим интерфейсам. Клиент будет ожидать, что определенные вещи будут верны для DataContract (потому что это контракт ). Если вы внесете критические изменения в этот контракт, вы нарушите условия клиентов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...