2012-04-02 7 views
0

Wenn ich eine generische Klasse in einem WCF-Dienst habenGetter und Setter für Generics über WCF

[DataContract(Name = "TestGenericOf{0}")] 
public class TestGeneric<T> 
{ 
    [DataMember] 
    public string TestProperty 
    { 
     get { return _testProperty.ToUpper(); } 
     set { _testProperty = value; } 
    } 

    private string _testProperty; 
} 

und einem Client (MVC in diesem Fall) verbraucht den Dienst durch einen Dienstverweis. Ich möchte die Getter- und Setter-Logik zwischen dem Dienst und dem Client teilen; Da die Klasse jedoch generisch ist, unterscheidet sich die auf dem Client erstellte Klasse von der auf dem Dienst.

public partial class TestGenericOfstring : object, System.Runtime.Serialization.IExtensibleDataObject, System.ComponentModel.INotifyPropertyChanged { 

    [System.Runtime.Serialization.OptionalFieldAttribute()] 
    private string TestPropertyField; 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public string TestProperty { 
     get { 
      return this.TestPropertyField; 
     } 
     set { 
      if ((object.ReferenceEquals(this.TestPropertyField, value) != true)) { 
       this.TestPropertyField = value; 
       this.RaisePropertyChanged("TestProperty"); 
      } 
     } 
    } 
} 

Was wäre der beste Weg, beide zu gehen über den gleichen Getter, Setter implementierende Logik auf den Service und dem Kunden?

+5

Es ist nur ein Datenvertrag, der einen Vertrag angibt, kein explizites Verhalten. Der Aufruf von ToUpper() wird nicht auf dem Client vorhanden sein (außer der Client verfügt über Ihre Klassen). – sisve

+0

Ich glaube, dass der Anruf zu 'ToUpper' noch immer passieren wird. Wenn Ihr Client den Webdienst aufruft, verwenden die Daten, die der WS zurückgibt, den Getter in Ihrem Code. Wenn Sie das WS nicht aufrufen und dieses Objekt nicht erhalten, sollten Sie die Eigenschaft wiederholt setzen und abrufen, und Sie sollten keine Probleme haben. Das ursprüngliche zurückgegebene Objekt sollte "ToUpper" aufgerufen haben. –

+0

@RyanP Sehr wahr, aber ich versuche, die Eigenschaft im Client festzulegen. Was wäre der sauberste Ansatz, um die Logik im Client zu duplizieren? – user654616

Antwort

0

Sie sollten in der Lage sein, die Assembly zu teilen, indem Sie sie in svcutil angeben, wenn Sie Ihren Clientcode generieren. Der generische Aspekt sollte keine Rolle spielen.

Überprüfen Sie diesen Link für ein Beispiel: http://www.codeproject.com/Articles/19625/Sharing-Types-Between-WCF-Service-and-Client

Update: Sie können auch sehen wollen in die KnownTypes Attribut der Serializer zu sagen, welche generische Typen es erwarten kann.