2012-05-14 7 views
6

ex:Kann der Namespace dynamisch zur Laufzeit in ServiceContract geändert werden?

[ServiceContract(Namespace = "@[email protected]/", 
     Name = "FedExContract")] 

Ich brauche den Wert von "@ services.url @" während der Laufzeit zu ändern.

+0

Warum ** brauchen Sie **, um den Namespace während der Laufzeit zu ändern? –

+0

Dies soll einige der bestehenden Prozesse unterstützen. Mein Client verwendet Eclipse zum Veröffentlichen der Dienste in IIS und ersetzt diese Tags während der Erstellung. Ich plane, alle diese Werte in die Datenbank statt in den Build-Prozess zu portieren. – WinFXGuy

+0

Ich kann mir nicht vorstellen, dass das möglich ist, ich meine praktisch, wie würde es funktionieren? Wann würde sich der Namensraum ändern? Wird es jedes Mal überprüft, wenn der Service aufgerufen wird? Ich kann nur sehen, dass etwas funktioniert, wenn der Dienst neu gestartet wird, wenn Sie vielleicht etwas aus einer db lesen könnten, aber dies ändert sich zur Laufzeit immer noch nur beim Start. Ihre aktuelle Prozedur ändert sich zur Laufzeit nicht, weshalb ich mir nicht sicher bin, warum dies jetzt erforderlich ist. –

Antwort

0

Kann denkt nicht irgendein andere als Bedingte Kompilierung Symbole verwenden, das heißt

#if Debug 
[ServiceContract(Namespace = "@[email protected]/", Name = "FedExContract")] 

#endif 

Namespaces statisch sein soll, wie Sie Ihre Client-Proxy neu erstellen können müssen, wenn Sie den Namensraum des Vertrages ändern.

+0

Möglicherweise ist dies die einzige verbleibende Option. – WinFXGuy

0

Sie können es während der Laufzeit ändern. Aber es würde eine Menge Arbeit sein und es müsste passieren, bevor der Dienst begann. Sobald der Dienst gestartet wird, können Sie die Vertragsinformationen nicht ändern.

Persönlich mag ich keinen Dienst starten, dass das abhängig von der DB ist. Wenn etwas kaputt geht, kommt der Service nie auf und die Fehlerbehebung kann für die IT ein komplizierter Prozess sein. Wenn ich die Laufzeit-Route gehen würde, würde ich den Namespace-Wert in meiner Konfigurationsdatei speichern. Es bleibt einfach und ermöglicht nach wie vor das Ersetzen eines Post-Deploy-Tokens, so wie Sie es in Ihrer Frage beschrieben haben.

Aus den Kommentaren erwähnen Sie Build-Prozess. So gehen wir vor: Machen Sie den Namespace zu einer konstanten Zeichenkette. So zum Beispiel:

[DataContract(Namespace=Constants.CURRENT_NAMESPACE] 
public class MyClass 
{ } 

nun in einer separaten Datei declare:

// in a separate file define: 
public static class Constants 
{ 
    public const string CURRENT_NAMESPACE = "url://Services"; 
}; 

Wenn Sie für eine andere Umgebung Swap zu bauen, die Konstanten für eine neue Definitionsdatei:

//As a part of your build process switch the Constants file: 
public static class Constants 
{ 
    public const string CURRENT_NAMESPACE = "url://Eclipse/Services"; 
}; 

Es ist leicht zu verwalten, man weiß immer, welcher Namensraum benutzt wird ... und der Dienst beginnt immer. Funktioniert es?

+0

Wir machen etwas ähnliches. Gibt es eine Möglichkeit, dies von MS Build statt Eclipse/Ant zu tun? – WinFXGuy

+0

Ich bin sicher, dass es da ist, aber ich bin nicht die richtige Person zu fragen. Könnte eine gute zweite Frage zum Posten sein. – ErnieL

Verwandte Themen