Frage

Wir erzwingen alle unsere Domain-Objekte GetHashCode zu implementieren.

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();
    }
  }
}

Wenn wir diese Domain-Objekte durch WCF aussetzen, wird die folgende erzeugt Dienst erfordert eine Post-Update-Modifikation zu kompilieren.

//------------------------------------------------------------------------------
// <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");
            }
        }
    }
}

Alle Ideen, wie die Forderung nach GetHashCode zu halten, sondern entfernen Sie die Voraussetzung für jeden Code auf dem Client (als Update oder als Teilklassen)?

War es hilfreich?

Lösung

Wenn Sie wirklich verlangen, dass alle C # Verbraucher Ihrer Verwendung WCF-Dienst die gleichen Modelle mit Original-Code in Takt verwenden Sie dann den „Dienstverweis hinzufügen“ Tool „Reuse-Typen in referenzierten Assemblys“ -Funktion. Achten Sie darauf, auszubrechen Ihre Modelle / Verträge / Schnittstellen in einer einzigen Baugruppe ohne weitere Umsetzung Code darin, die als Shared „Definition“ dient Montage. Markieren Sie diese Baugruppe als eine zu Wiederverwendung Typen aus, wenn das „Dienstverweis hinzufügen“ Tool generiert Ihren Client-Proxy-Code.

Auch nur eine proaktive Warnung: simplify Dinge für sich selbst nur mit einem „offiziellen“ C # Service-Client-Implementierung für Ihren Dienst. Fügen Sie keine redundanten Dienstverweis von Visual Studio zu jedem einzelnen Projekt generierten Proxies, die Konnektivität mit Ihrem Service erfordert.

EDIT:

Beim Reden aus dem letzten persönlicher Erfahrung, einen modularen, servicefähigen API entwickelt haben, lassen Sie mich zum Thema Modularität allgemeine Beratung bieten, wie es betrifft nicht nur WCF-Dienste, aber das übergeordnete Design.

In unserem System haben wir das getan, was ich oben vorgeschlagen, eine einzige „Definition“ Montage zu schaffen, die nur markierte Objekte enthält als [DataContract]. Domain-Objekte, Modelle, Datenverträge, was auch immer Sie auf sie beziehen möchten

In dieser Anordnung ist auch eine Sammlung von Repository-Schnittstellen, die Methoden ausschließlich im Sinne dieser Domain-Objekte definiert. Darüber hinaus gibt es stark typisierte Bezeichner structs in dieser Baugruppe definiert, die pro jedes Modell zu halten, Identitätswerte verwendet werden, da diese Modelle Datenbank beibehalten und jeder hat eine Identitätsspalte. Mit structs die Wrap ints auf diese Weise int selbst mit vorzuziehen, da wir nun Compiler unterstützt die semantische Analyse erhalten, dh Model1ID ist nicht konvertierbar Model2ID wie sie semantisch trotz der Tatsache, zwei verschiedene Domänen darstellen, dass beide Domänen sind darstellbar durch die int Typ .

Was die Modularität antreibt, ist die Definition dieser Repository-Schnittstellen. Die WCF-Service-Implementierung-Klasse implementiert einfach alle die notwendigen Schnittstellen, in ähnlicher Weise mit der WCF-Service-Client-Implementierungsklasse, die Datenbank-Repository Implementierungsklasse, die Caching-Proxy-Implementierungsklasse, Implementierungsklasse der Methodenaufrufes Protokollierung, usw. Alle von den konkreten existieren Implementierungsklassen in andere Baugruppen, also nicht in der „Definition“ Anordnung, die enthält, die Schnittstellen und Modelle. Diese Klassen, den Schnittstellen implementieren und für den Verbraucher Code als gleich erscheinen.

Der Schlüssel ist Ihr API Verbraucher Code Agnostiker der spezifischen Implementierungsklassen zu halten und nur die Schnittstellen verweisen. Die Modelle selbst sind als einfache Datencontainer ohne Business-Logik Umsetzung in ihnen gefunden gehalten. Ich glaube, dass dieses Muster als anämisch bezeichnet wird, aber für mich „anämisch“ hat eine negative Konnotation, so mag ich nicht diesen Begriff zu verwenden, wenn Sie diesen Entwurf beschreiben.

Was man bekommt, ist der Verbraucher Code Geschäftslogik implementieren, die nicht scheren, ob es zu einem WCF-Dienst spricht oder direkt in eine Datenbank oder das Caching nahtlos umgesetzt wird, oder dass Ihre Methode Anrufungen angemeldet werden, oder was auch immer andere Proxy-Anwendungen Sie können sich mit.

Insgesamt Design mit Schnittstellen und Ihr Leben leichter machen für sich selbst. Aber dies nur tun, wenn Sie in Ihrer Fähigkeit zur Selbstbeschränkung der Praxis überzeugt sind. In unserem System, das ich entworfen, haben wir T4-Vorlagen, die fast alle der Standardcode generieren, die mit WCF-Dienste auf den Punkt entlang kommt, wo alles, was wir von Hand das Modell definieren ist zu tun haben, gestalten die Schnittstelle, und schreiben Sie die Datenbank Zugangscode . Die WCF Fassade kommt kostenlos mit einem einfachen Rechtsklick und „Run Custom Tool“ auf den T4-Vorlagen. Ich liebe es. :)

Andere Tipps

Befestigen Sie den Namespace auf dem Teilklasse. Möglicherweise müssen Sie die Attribute und Vererbung anzupassen.

namespace DCS2000.IDCardExclude.UI.IdCardManagerServiceReference
{
  [Serializable]
  [DataContract]
  public partial class IdCard : DomainObject
  {
    public override int GetHashCode()
    {
        return EffDte.GetHashCode();
    }
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top