簡體   English   中英

在.net遠程處理中初始化服務器激活的對象

[英]Initialising server activated objects in .net remoting

我在.net遠程處理中使用了單呼叫服務器激活的對象,並且對如何初始化遠程對象有疑問。

當我的服務器調用RemotingConfiguration.RegisterWellKnownServiceType()時,它將對要實例化的對象的類型的引用傳遞給服務客戶端請求。 在創建Thay之后以及客戶端使用它們之前,如何初始化這些“遠程對象”?

就我而言,遠程對象需要連接到數據庫,因此它們需要一個連接字符串。 當創建包含服務器時不知道它們,並且遠程對象沒有對包含服務器的引用時,它們應該如何獲取呢? 我在這里想念什么?

(目前,我的解決方法是將連接字符串存儲在一個靜態字段中,因為所有遠程對象當前都使用同一數據庫。但是,這不是很靈活,對我來說似乎是一種黑客。)

我認為沒有簡單而干凈的方法來創建對象。 遠程調用進入時,將創建該對象。

我也不認為這是必要的。 您可以創建另一個處理所有初始化的類(它從所需的任何地方獲取連接字符串,等等),然后可以從遠程處理對象中提取連接字符串。 您將在進程啟動時創建該對象。

否則,您可以在對象的構造函數中添加一些邏輯。 它可以從配置文件或任何您喜歡的文件中讀取連接字符串。 您也可以延遲加載該對象中標出的變量(即,如果connectionString = null,則GetConnectionString();)。確實有很多選擇。

請記住,我不建議在SingleCall SAO中進行初始化工作,因為必須在每次對SAO的調用中進行此工作。

要管理連接字符串,我使用連接管理器類。

請考慮以下代碼偽代碼,因為我只是為了說明一個想法而寫了它。 我已經將這種模式用於我編寫的各種系統。


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];
   }
}

您的數據庫代碼將使用連接管理器類檢索連接字符串。

請記住,.NET遠程處理已被WCF取代,但是我們中的某些人仍然在舊版代碼中進行了遠程處理:-)

我希望這有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM