Кошмар с передачей наследства через WCF

У нас есть класс в WCF Service, как показано ниже

[DataContract]
public class SampleClass:ICloneable
{ public object Clone()  { return MemberwiseClone(); } .... }

На стороне клиента, где добавлены ссылки на службы, я открываю ссылку в обозревателе объектов, но она не передает ICloneable как унаследованный интерфейс, такой как "IExtensibleDataObject"

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="SampleClass",
Namespace="http://schemas.datacontract.org/2004/07/TestService")]
[System.SerializableAttribute()]
public partial class SampleClass : object, System.Runtime.Serialization.IExtensibleDataObject,
System.ComponentModel.INotifyPropertyChanged { .... }

Кто-нибудь знает, как мне это пройти?

1 ответ

Это не может и не должно быть передано. Реализует ли объект ICloneable не является частью договора на обслуживание Сервер не заботится о том, клонирует ли клиент объекты, и не может предоставить реализацию для операции клонирования.

Если вы хотите, чтобы ваши объекты были клонируемыми, вам нужно предоставить реализацию на стороне клиента - обратите внимание, что класс partial, так что вы можете просто создать новый файл, который гласит:

public partial class SampleClass : ICloneable {
    public object Clone() { 
        return MemberwiseClone();
    }
}

Конечно, если вы должны сделать это для всех сгенерированных типов, это может быть проблемой. Если вы также пишете службу (или имеете доступ к источнику), и она уже содержит правильное Clone реализации, вы можете использовать одни и те же классы как на клиенте, так и на сервере, поместив их в отдельную сборку. Это не совсем тривиально, потому что вам нужно обойти некоторые упрямства в Visual Studio; см. " WCF и Общая справочная библиотека между клиентом и сервисом" для получения более подробной информации.

Обратите внимание, что MSDN говорит:

ICloneable интерфейс просто требует, чтобы ваша реализация Clone Метод возвращает копию текущего экземпляра объекта. Он не указывает, выполняет ли операция клонирования глубокое копирование, поверхностное копирование или что-то промежуточное. Также не требуется, чтобы все значения свойств исходного экземпляра были скопированы в новый экземпляр. Например, NumberFormatInfo.Clone Метод выполняет поверхностную копию всех свойств, кроме NumberFormatInfo.IsReadOnly имущество; он всегда устанавливает значение этого свойства в клонированный объект как false. Потому что абоненты Clone не может зависеть от метода, выполняющего предсказуемую операцию клонирования, мы рекомендуем ICloneable не должно быть реализовано в публичных API.

Если вам нужен объект, который можно клонировать, вы все равно можете реализовать свой собственный Clone метод (и использование MemberwiseClone если это уместно) но, вероятно, нет веских причин для использования ICloneable,

Другие вопросы по тегам