WCF - DataContract путем копирования / вставки исходного кода или автоматически сгенерированного кода для общего абстрактного класса? - PullRequest
0 голосов
/ 20 июня 2011
[DataContract]
public abstract class FooBase
{
    [DataMember]
    public int Bar { get; set; }
}

Это базовый класс, который я использую в качестве базового класса для других классов, которые также являются DataContracts. Вот в чем проблема ...

В Proj1 я выбираю Добавить ссылку на службу ... (MyService), и она генерирует код для меня, включая код FooBase. В Proj2 я выбираю Добавить ссылку на службу ... (OtherService), и она делает то же самое.

Но я хочу, чтобы базовый класс Foo находился в собственной сборке, на которую могут ссылаться оба проекта ... так что лучше:

Скопируйте / вставьте класс FooBase в другую совместно используемую сборку как есть?

[DataContract]
public abstract class FooBase
{
    [DataMember]
    public int Bar { get; set; }
}

Или скопировать / вставить сгенерированный код для класса FooBase в другую общую сборку?

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="FooBase", Namespace="http://schemas.datacontract.org/2004/07/MyNamespace")]
[System.SerializableAttribute()]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(MyNamespace.Proj1.TypeA))]
[System.Runtime.Serialization.KnownTypeAttribute(typeof(MyNamespace.Proj1.TypeB))]
public partial class FooBase : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged {

    [System.NonSerializedAttribute()]
    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

    private int BarField;

    [global::System.ComponentModel.BrowsableAttribute(false)]
    public System.Runtime.Serialization.ExtensionDataObject ExtensionData {
        get {
            return this.extensionDataField;
        }
        set {
            this.extensionDataField = value;
        }
    }

    [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
    public int Bar {
        get {
            return this.BarField;
        }
        set {
            if ((this.BarField.Equals(value) != true)) {
                this.BarField = value;
                this.RaisePropertyChanged("Bar");
            }
        }
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

1 Ответ

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

Вы можете иметь его в общей библиотеке, но при добавлении ссылки на службу убедитесь, что на общую библиотеку ссылаются и что в дополнительных настройках диалогового окна добавления ссылки вы выбрали Повторное использование типов во всех ссылочных сборках.

Я бы предпочел использовать не сгенерированный код в общей библиотеке, то есть код только с контрактами на данные.

...