2016-06-01 3 views
1

Ich habe Desktop-Anwendung, die WCF-Dienste verwendet. Ich habe große Benutzerfreundlichkeit verbessert, wenn ich asynchrone WCF-Aufrufe implementiert habe.WCF Service Client Initialisierung Strategie

Meine Frage ist: Was ist die beste Vorgehensweise, um Service-Client zu initialisieren?

In der vorherigen Realisierung gab es ein einzelnes statisches Objekt mit Anmeldeinformationen und eine öffentliche Methode GetClient(), die new ServiceClient vor jedem Aufruf erstellt wurde.

using (var svc = ServiceClientFactory.GetClient()) { 
    var data = svc.CallMethod(...); 
    some_application_context.specific_attribute = data; 
} 

so, vor jedem Aufruf wurde erstellt neue Client, die sofort zerstört wurde nach der Operation beendet war und empfangenen Daten verwendet: Bei der Anwendung wurde es eine solche Konstruktion verwendet.

Meine Frage ist: Ist es die beste Vorgehensweise, Client-Konstruktor vor jedem Aufruf aufzurufen?

Ich habe versucht, ein einzelnes statisches Client-Objekt zu erstellen, das einmal beim Start initialisiert und einmal beim Schließen der Anwendung zerstört wird, aber ich habe keinen fiktiven Leistungsgewinn.

Scheint wie es funktioniert gut, aber ich frage mich, ob es nicht sehr offensichtliche Hindernisse bei der Verwendung einzelner Client? Und was wird empfohlen?

Antwort

0

Es ist eine breite Frage, es hängt von vielen Faktoren ab und auch vom Stil, denke ich.

Wenn Sie zuverlässige Sitzungen oder Sitzungen im Allgemeinen verwenden, müssen Sie die Referenz natürlich speichern. Wenn der Dienst mehrmals aufgerufen wird, ist es möglicherweise besser, die Referenz zu speichern, oder nicht. Profiliere es dann und dort besser.

Ich speichere immer eine Referenz und erstelle eine Eigenschaft, die überprüft, ob der Client null ist oder sich im Faulted State befindet.

Service.ServiceClient ShippingService 
{ 
    get 
    { 
     if (mService == null || mService.State == CommunicationState.Faulted) 
     { 
     mService = new Service.ServiceClient("netTcpService"); 
     mShippingService.Open(); 
     } 

     return mService; 
    } 
} 
+0

'mService.State' - das waren die Hindernisse, nach denen ich gefragt habe – obratim

0

Sie sollten sich die Abhängigkeitsinjektion ansehen, um Ihre Service-Referenzen zu erhalten. Effektiv wäre es ähnlich, wenn nicht die gleiche Leistung wie das, was Sie jetzt tun, aber es würde die langfristige Verwaltung erleichtern und ein einfacheres Komponententesten ermöglichen.

Der größte Teil des WCF-Overheads ist die Verbindungsaushandlung, so dass Singleton vs. Neu bei jedem Aufruf nicht wirklich einen großen Unterschied machen.