我在.net远程处理中使用单呼叫服务器激活的对象,并且对如何初始化远程对象有疑问。
当我的服务器调用RemotingConfiguration.RegisterWellKnownServiceType()时,它会将对要实例化的对象的Type的引用传递给服务客户端请求。如何在创建这些“远程对象”之后以及在客户端使用它们之前初始化这些“远程对象”?
在我的例子中,远程对象需要连接到数据库,因此需要连接字符串。如果包含服务器在创建时不知道,并且远程对象没有对包含服务器的引用,他们应该如何获取?我在这里缺少什么?
(目前我的解决方法是将连接字符串存储在静态字段中,因为所有远程对象当前都使用相同的数据库。虽然这不是很灵活,看起来像是对我的黑客攻击。)
答案 0 :(得分:0)
我认为没有一种简单而干净的方法来创建对象。当远程调用进入时,对象就会被创建。
我认为不需要这样做。您可以创建另一个处理所有初始化的类(它从任何地方获取连接字符串等),然后您可以从远程处理对象中提取连接字符串。您可以自己在流程启动时创建该对象。
否则,您可以在对象的构造函数中放置一些逻辑。它可以从配置文件或您喜欢的任何内容中读取连接字符串。你也可以延迟加载在该对象中decalred的变量(即如果connectionString = null,那么GetConnectionString();)真的有很多选项。
答案 1 :(得分:0)
请记住,我不建议在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取代,但我们中的一些人仍在遗留代码中进行远程处理: - )
我希望这有帮助!