[英]Remoting in C# VS versioning
在C#中使用遠程處理,我正在連接到其他服務器。 當我在客戶端不斷添加功能時,服務器端的服務並不總是最新的。
如果我在接口中調用一個方法(該方法在服務器上遠程調用該方法)而該方法在服務器端的實現中不存在,該如何解決呢?
客戶端自然崩潰,因為有一個我無法捕獲的異常。 是的,我可以,但是由於我用這種方法調用了許多不同的方法,因此為每個方法添加異常處理將很痛苦。
我堅決提出的“解決方案”是在我的MarshalByRefObject
為每個方法添加自定義版本屬性。 但是我不知道以后在調用每個方法時如何使用它。 對每個方法添加注釋/屬性是可以的,但是再次使用if
語句詢問版本是否足夠新將是一件很痛苦的事情。
我考慮的另一種方法是為此使用繼承。
public abstract class AbstractServer1 : MarshalByRefObject
{
public abstract void feature1();
}
public abstract class AbstractServer2 : AbstractServer1
{
public abstract featureInVersion2();
public abstract string reallyNewFeature();
}
public class ServerClass1 : AbstractServer1
{
public void feature1();
}
public class ServerClass2 : ServerClass1, AbstractServer2
{
public void featureInVersion2();
public string reallyNewFeature();
}
但這會導致類似:
public AbstractServer getRemoteObject(string host, int port)
{
object obj = Activator.GetObject(typeof(AbstractServer2), "tcp://" + host + ":" + port.ToString() + "/ServiceName");
if (typeof(obj) == ServerClass1)
{
...
}
}
這既不美觀也不起作用。
有一個好的解決方案嗎?
備注:不幸的是,不能在服務器和客戶端中使用相同的程序集文件。
任何幫助表示贊賞。
調用服務器端不存在的函數時,您期望什么樣的行為?
它構建一個代理,以捕獲調用實現特定接口的對象的成員時發生的所有異常。 您可以在wpf通道或Remoting代理的接口成員上使用此功能。
IMyInterface myService = [...];
IMyInterface myExceptionLoggedService = ExceptionProxyGenerator.Generate<IMyInterface>(myService);
(myExceptionLoggedService as IExceptionProxy).Error+=(sender,method,exception)=>{
// do what you want on exception
};
// Use my service :
myExceptionLoggedService.MyExistingFunction();// ok
myExceptionLoggedService.MyNotExistingFunction();// calling the above delegate
您可以重寫此類以使其具有所需的行為(例如不將錯誤拋出異常並返回null -if函數未返回void-)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.