.Net远程处理,版本控制和CAO

时间:2012-02-22 15:55:42

标签: c# .net client-server versioning .net-remoting

我的客户端/服务器远程处理应用程序有以下设计:

flow diagram 强大的名为SharedTypes程序集仅包含接口。服务器程序集实现它们。我的CAO(客户端激活对象)是Account类型。

我正在实施工厂设计模式来处理CAO。即作为服务器激活对象(Singleton)运行的工厂(Server)有一个方法CreateAccount将“真实类”(Account CAO)的新实例返回给客户。这样做的好处在于我不必将实现分发给客户端程序集。

由于SharedTypes程序集版本将随着时间的推移而更新,我想确保它仍然向后兼容针对旧版本构建的旧版客户端。

我的previous问题询问了为什么在构建客户端引用旧版共享程序集时访问SAO(服务器激活对象)时未抛出异常。

我发现MSDN在“服务器激活对象”部分下显示here

  

如果配置服务时未提供版本信息,   当对象出现时,将使用最新版本的程序集   活性。例如,如果您有两个程序集,MyHello版本   1.0.0.0和MyHello版本2.0.0.0,如果没有版本信息,则使用版本2程序集激活众所周知的对象   提供。重要的是要注意使用此版本   无论客户端构建时引用的版本如何。

因此,老客户似乎总能得到最新的SAO,并可以对其进行调用。但是,对于CAO,它声明:

  

无法配置为客户端激活的版本;版本   始终使用客户端构建。

对于由客户端使用new运算符或Activator.CreateInstance(来自Ingo Rammer Advanced .NET Remoting(C#Edition))实例化的CAO:

  

当请求的CAO版本不是时,服务器会执行什么操作   available是获取指定程序集的最高版本。   当GAC中提供版本1.0.1.0和2.0.0.1时,和   请求版本1.0.0.1,服务器将选择2.0.0.1   实例化请求的对象 - 即使它们在专业中有所不同   版本号。

但是,由于我使用工厂设计模式来实例化Account CAO this does not seem to apply,因此在尝试从针对更高版本构建的服务器获取Account对象时出现System.InvalidCastException: Return argument has an invalid type异常SharedTypes的版本比Client的版本。

似乎为了模拟解析程序集版本的标准行为,或者重定向到完全不同的版本,我需要在客户端的应用程序配置文件中使用assemblyBinding条目,例如:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
  <dependentAssembly>
    <assemblyIdentity name="ServerLib"
             publicKeyToken="2752785e627d5953"
             culture="neutral" />
    <bindingRedirect oldVersion="1.0.0.0"
             newVersion="2.0.0.0" />
  </dependentAssembly>
</assemblyBinding>

或使用发布者策略进行重定向(因为SharedTypes是一个强名称程序集)。

在处理使用工厂设计模式返回的CAO时,这是版本控制的最佳方法吗?

PS:对于长篇解释感到抱歉,但认为这有助于完整描述情景,并确保我的理解是正确的。

0 个答案:

没有答案