我的客户端/服务器远程处理应用程序有以下设计:
强大的名为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:对于长篇解释感到抱歉,但认为这有助于完整描述情景,并确保我的理解是正确的。