2009-08-25 5 views
1

Ich benutze Single-Call-Server aktivierte Objekte in. Net Remoting, und habe eine Frage darüber, wie die Remoted-Objekte zu initialisieren.Initialisierung von Server-aktivierten Objekten in .net Remoting

Wenn mein Server RemotingConfiguration.RegisterWellKnownServiceType() aufruft, übergibt er einen Verweis auf den Typ des Objekts, das instanziiert werden soll, um Clientanforderungen zu bedienen. Wie initialisiere ich diese "Remote-Objekte", nachdem sie erstellt wurden und bevor der Client sie verwendet?

In meinem Fall müssen die Remote-Objekte eine Verbindung zu einer Datenbank herstellen, daher benötigen sie eine Verbindungszeichenfolge. Wie sollten sie dies erhalten, wenn der enthaltende Server beim Erstellen nicht bekannt ist und das entfernte Objekt keine Verweise auf den enthaltenen Server hat? Was fehlt mir hier?

(Meine Abhilfe für den Moment ist die Verbindungszeichenfolge in einem statischen Feld zu speichern, da alle Remote-Objekte zur Zeit die gleiche Datenbank verwenden. Dies ist jedoch nicht sehr flexibel, und sieht aus wie ein Hack zu mir.)

Antwort

0

Ich glaube nicht, dass es eine einfache und saubere Möglichkeit gibt, das Objekt einfach zu erstellen. Das Objekt wird erstellt, wenn ein Remoting-Anruf eingeht.

Ich glaube nicht, dass es einen Bedarf dafür gibt. Sie können eine andere Klasse erstellen, die die gesamte Initialisierung verarbeitet (sie ruft die Verbindungszeichenfolge von wo auch immer ab, usw.) und Sie können dann die Verbindungszeichenfolge aus dem Remoting-Objekt abrufen. Sie würden dieses Objekt beim Prozessstart selbst erstellen.

Andernfalls können Sie eine Logik in den Konstruktor des Objekts einfügen. Es kann vielleicht die Verbindungszeichenfolge von einer Konfigurationsdatei oder was auch immer Sie mögen lesen. Sie können auch die in diesem Objekt deklarierten Variablen laden (d. H. Wenn connectionString = null, dann GetConnectionString();). Es gibt wirklich viele Optionen.

0

Bitte beachten Sie, dass ich keine Initialisierungsarbeiten in einem SingleCall SAO vorschlagen würde, da diese Arbeit bei jedem Aufruf an das SAO durchgeführt werden muss.

Um Verbindungszeichenfolgen zu verwalten, verwende ich eine Verbindungsmanager-Klasse.

Bitte beachten Sie den folgenden Code Pseudocode, wie ich es gerade geschrieben habe, um eine Idee zu veranschaulichen. Ich habe dieses Muster für verschiedene Systeme verwendet, die ich geschrieben habe.


public enum DBConnection 
{ 
    DBTest1, 
    DBTest2 
} 

public static class ConnectionStringManager 
{ 
    static Exception _construtorException = null; 
    static Dictionary _connectionMap = new Dictionary(); 

    static ConnectionStringManager() 
    { 
     try 
     { 
     // Load the _connectionMap 
     // You can use a custom application configuration section or 
     // connection strings defined as described in the following article 
     // http://msdn.microsoft.com/en-us/library/bf7sd233.aspx 
     } 
     catch(Exception ex) 
     { 
     // Any exception thrown in a static constructor needs to be kept track of because static 
     // constructors are called during type initialization and exceptions thrown 
     // are not caught by normal application exception handling. 
     // (At least as of .NET 2.0) 

     _constructorException = ex; 
     } 
    } 

    public static string GetConnectionString(DBConnection conn) 
    { 
     if (_constructorEx != null) 
     throw new Exception("Error initializing ConnectionStringManager", _constructorException); 

     if (!_connectionMap.ContainsKey(conn)) 
     throw new Exception(string.Format("Connection {0} not found", Enum.GetName(typeof(DBconnection), (int)conn)); 

     return _connectionMap[conn]; 
    } 
} 

Ihr Datenbankcode verwendet die Verbindungsmanagerklasse, um Verbindungszeichenfolgen abzurufen.

Beachten Sie, dass .NET-Remote durch WCF ersetzt wurde, aber einige von uns noch in unserer Remote Legacy-Code haben :-)

Ich hoffe, das hilft!