2012-04-03 6 views
3

Ich habe ein Webservice-Projekt (alte asmx-Technologie), in dem ich eine Klasse User habe. Diese Klasse verfügt über eine DateTime-Eigenschaft, die das Geburtsdatum dieses Benutzers darstellt. Neben dieser Klasse habe ich eine andere Datei mit einer partiellen Klasse User. In dieser Teilklasse, füge ich eine Eigenschaft ‚Age‘, die das Alter des Benutzers zurückgibt:Teilklassen verloren durch eine Webservice-Referenz

public partial class User 
{ 
    public DateTime Age 
    { 
     get { return DateTime.Now - this.Birthdate; } 
    } 
} 

Der Grund, dass dies in einer partiellen Klasse ist, da der Code Benutzerklasse wird aus einer Konfigurationsdatei automatisch erzeugt, und ich kann dieser Klasse keinen Code hinzufügen, ohne dass sie jedes Mal entfernt wird, wenn der Code generiert wird.

Jetzt in meinem Webservice habe ich eine Webmethode, die eine Liste dieser Benutzer zurückgibt, die sie aus einer Datenbank erhält:

[WebMethod] 
public List<User> GetUsers() 
{ 
    return Database.LoadUsers(); 
} 

Einfach genug ... Wie auch immer, in einem anderen Projekt jetzt, füge ich einen Dienst Verweis auf diesen Webservice. Es erzeugt den Service-Client und eine Benutzerklasse für mich. Das Problem ist: Diese Benutzerklasse enthält nicht die Eigenschaften, die in der partiellen Klasse definiert sind (Alter in diesem Beispiel) ... Es scheint, dass der Webservice diese Information nicht bekommt.

Natürlich kann ich eine neue partielle Benutzerklasse erstellen und sie im zweiten Projekt neu schreiben, aber ich sollte nicht, sollte ich? Warum erkennt der Webservice die Teilklasse nicht?

Antwort

3

Teilklassen sind keine Erweiterungsmethoden. Sie werden in jeder Baugruppe zu einer Klasse zusammengefasst. Sie haben zwei Möglichkeiten für das, was Sie tun möchten:

Option 1

Add the partial class you wrote as a link in das neue Projekt. Es wird die gleiche Datei sein, aber verknüpft in das neue Projekt. Wenn Sie zu Hinzufügen -> Vorhandenes Element gehen, wählen Sie den Pfeil nach Öffnen und wählen Sie "Als Link hinzufügen".

Option 2

eine Erweiterungsmethode erstellen:

public static class DateExtensions 
{ 
    public TimeSpan GetAge(this DateTime birthDate) 
    { 
     return DateTime.Now - birthDate; 
    } 
} 

Dann nur eine using Anweisung für hinzufügen, was Namespace Ihre Nebenklasse ist, und stellen Sie sicher, dass das Projekt/Assembly verwiesen wird, und Sie können dies nennen:

// This is your BirthDate property that would come back and is DateTime 
var birthDate = new SomeService().DoSomething().BirthDate; 

var age = birthDate.GetAge(); 

Option 3

Erstellen Sie ein separates Projekt und legen Sie die Service-Referenz und teilweise darin. Verweisen Sie das Projekt (und die erforderlichen Framework-Referenzen) von Ihrem mit Projekten.

Ich habe an example for you to view/use on GitHub erstellt.

+0

Option 1 funktioniert nicht, weil die partielle Klasse sich dann nicht mehr im selben Projekt befindet (und nicht auf die Eigenschaften der eigentlichen Klasse zugreifen kann). Option 2 funktioniert nur für dieses einfache Beispiel und hängt nicht wirklich mit meinem Problem zusammen, ich kann es nicht für mein aktuelles Projekt verwenden. Wenn die partielle Klasse in der Assembly zusammen kompiliert wird, warum sieht die Webservice-Referenz die Eigenschaften in der partiellen Klasse nicht? Sie sollten nach der Kompilierung in der gleichen Klasse sein (zusammen kompiliert!) –

+0

Ich verstehe Option 2, aber Sie sind falsch bei Option 1. Das Hinzufügen als Link ist genau das gleiche wie ** Kopieren der Quelldatei in das neue Projekt, außer es gibt nur eine einzige Instanz der eigentlichen Datei, und Wenn Sie es an einer Stelle ändern, ändert es sich in allen, da es sich um dieselbe Datei handelt. –

+0

Wenn Sie die zweite Servicereferenz hinzufügen, verweisen Sie nicht auf eine Assembly. Sie fügen Ihrem neuen Projekt neuen Quellcode hinzu. Die Proxy-Klasse ist eine separate Datei, wenn Sie eine neue Referenz hinzufügen, daher müssen Sie Ihre Teildatei als ** Link ** hinzufügen. Es handelt sich nicht um eine Kopie, sondern um einen Verweis auf den ursprünglichen Speicherort, der jedoch in beide Projektassemblys kompiliert wird. –

0

Wenn Sie Ihren Client fest an Ihren Dienst koppeln müssen, können Sie möglicherweise die Dienstreferenz abrufen, um dieselben Typen wiederzuverwenden, die vom Dienst verwendet werden. Verschieben Sie die fraglichen Typen einfach in ihr eigenes Projekt und ihre Assembly, und verweisen Sie auf die Client- und Serverprojekte.

Mein Zögern ist, dass dies mit einem WCF-Dienst funktioniert, aber ich habe es nie mit einem ASMX-Dienst getan.