代码之家  ›  专栏  ›  技术社区  ›  Andy Johnson

在.net远程处理中初始化服务器激活的对象

  •  1
  • Andy Johnson  · 技术社区  · 16 年前

    当我的服务器调用R时emotingConfiguration.RegisterWellKnownServiceType服务类型()它传递对要实例化的对象类型的引用,以服务客户机请求。如何在这些“远程对象”被创建之后和客户端使用之前初始化它们?

    在我的例子中,远程对象需要连接到数据库,所以它们需要一个连接字符串。当包含服务器不知道它们是何时创建的,并且远程对象没有对包含服务器的引用时,它们应该如何获取这些信息?我错过了什么?

    (我目前的解决方法是将连接字符串存储在静态字段中,因为所有远程对象当前都使用相同的数据库。不过,这不是很灵活,在我看来像是一个黑客。)

    2 回复  |  直到 16 年前
        1
  •  0
  •   Mark    16 年前

    我不认为有一个简单而干净的方法来创建对象。当远程处理调用传入时,将创建该对象。

    不过,我认为也没有必要这么做。您可以创建另一个类来处理所有初始化(它从任何地方获取连接字符串,等等),然后您可以从远程处理对象中提取连接字符串。您可以在进程启动时自己创建该对象。

    否则,可以在对象的构造函数中放入一些逻辑。它可以从配置文件或任何你喜欢的文件中读取连接字符串。您还可以延迟加载该对象中标记的变量(即,如果connectionString=null,那么GetConnectionString();),实际上有很多选项。

        2
  •  0
  •   Nathan Fox    16 年前

    请记住,我不建议在单次调用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取代,但我们中的一些人在遗留代码中仍有远程处理:-)

    我希望这有帮助!