Способы сохранения абстрактного метода Server Server для WCF

StackOverflow https://stackoverflow.com/questions/3873605

Вопрос

Мы обеспечиваем все наши доменные объекты для реализации GetHashCode.

namespace Core
{
  [Serializable]
  public abstract class DomainObject
  {
    public abstract override int GetHashCode();
  }
}

namespace Entity.Domain
{
  [Serializable]
  [DataContract]
  public partial class IdCard : DomainObject
  {
    private System.Int32 _effDte;

    [DataMember]
    public virtual System.Int32 EffDte
    {
        get { return _effDte; }
        set { _effDte = value; }
    }

    public override int GetHashCode()
    {
        return EffDte.GetHashCode();
    }
  }
}

Когда мы выставляем эти доменные объекты через WCF, следующая сгенерированная служба требует модификации после обновления для компиляции.

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.3053
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace IdCardManagerServiceReference {
using System.Runtime.Serialization;
using System;


[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="IdCard", Namespace="http://schemas.datacontract.org/2004/07/Entity.Domain")]
[System.SerializableAttribute()]
public partial class IdCard : Core.DomainObject, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged { 
    [System.NonSerializedAttribute()]
    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

    [System.Runtime.Serialization.OptionalFieldAttribute()]
    private int EffDteField;

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

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

Любые идеи о том, как сохранить требование для GethashCode, но удалите требование для любого кода на клиенте (как обновление или в качестве частичных классов)?

Это было полезно?

Решение

Если вам действительно требуется, чтобы все потребители C # вашего WCF используют одни и те же модели с оригинальным кодом в TACT, а затем используйте типы повторных типов инструмента «Добавить сервис» в типы повторного использования в ссылках с монтажными узлами. Обязательно вырутите свои модели / контракты / интерфейсы в единую сборку без другого кода реализации в нем, что служит совместным «определением» сборки. Отметьте эту сборку в качестве повторного использования типов, от того, когда инструмент «Add Service Reference» генерирует ваш клиентский прокси-код.

Кроме того, просто проактивное предупреждение: упрощайте вещи для себя, имея только один «официальный» реализацию клиента C # Service для вашего обслуживания. Не добавляйте избыточные опорные прокси-сервисы обслуживания, сгенерированные Visual Studio к каждому одному проекту, который требует подключения с вашим обслуживанием.

РЕДАКТИРОВАТЬ:

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

В нашей системе мы сделали то, что предложило выше, в создании единого «определения» сборки, которая содержит только объекты, помеченные как [DataContract]: Объекты домена, модели, контракты данных, все, что вам нравится ссылаться на них.

В этой сборке также является коллекцией интерфейсов репозитория, которые определяют методы исключительно с точки зрения этих доменных объектов. Также существуют сильно напечатанные структуры идентификатора, определенные в этой сборке, которые используются для проведения значений идентификаторов на каждую модель, поскольку эти модели сохраняются в базе данных, и у каждого есть столбец идентификатора. Используя структуры, которые обернут intS таким способом предпочтительнее использования int Сам по себе мы получаем семантический анализ компилятора, то есть Model1ID не конвертируется для Model2ID Когда они семантически представляют два разных домена, несмотря на то, что оба домены представлены int тип.

Какие приводы модульность - это определение этих интерфейсов репозитория. Класс реализации службы WCF просто реализует все необходимые интерфейсы, аналогичные с классом реализации клиента службы WCF, класс реализации репозитория базы данных, класс реализации прокси-кэширования, класс регистрации на вызове метода и т. Д. Все классы бетонной реализации существуют в Другие сборки, то есть не в сборке «Определение», которое содержит интерфейсы и модели. Эти классы реализуют интерфейсы и появляются потребительским кодом как одинаково.

Ключ состоит в том, чтобы сохранить ваш потребительский код API агностик конкретных классов реализации и ссылаться только на интерфейсы. Сами модели хранятся в качестве простых контейнеров данных без реализации логики бизнес-логики. Я считаю, что этот шаблон называется анемией, но для меня «анемично» имеет негативные коннотации, поэтому я не люблю использовать этот термин при описании этой конструкции.

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

Таким образом, дизайн с интерфейсами и облегчить свою жизнь для себя. Но только делайте это, если вы уверены в своей способности практиковать самоотера. В нашей системе, которую я разработал, у нас есть шаблоны T4, которые генерируют практически все код для котельного платля, который приходит вместе с службами WCF в точку, где все, что мы должны делать вручную, определяют модель, разработайте интерфейс и напишите код доступа к базе данных Отказ Фасад WCF выходит бесплатно с простой щелч щелчком щелчков правой кнопкой мыши и «Запустить пользовательский инструмент» на шаблонах T4. Я люблю это. :)

Другие советы

Исправьте пространство имен на вашем частичном классе. Вам может потребоваться отрегулировать атрибуты и наследование.

namespace DCS2000.IDCardExclude.UI.IdCardManagerServiceReference
{
  [Serializable]
  [DataContract]
  public partial class IdCard : DomainObject
  {
    public override int GetHashCode()
    {
        return EffDte.GetHashCode();
    }
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top