我有一个服务结构状态服务,它暴露了一个界面,如:
public interface IAction
{
Task GetCustomer (Customer customer)
}
Run Code Online (Sandbox Code Playgroud)
Customer类看起来像
[DataContract]
public class Customer
{
[DataMember]
public string Id {get;set;}
[DataMember]
public string Name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我现在通过nuget共享包含上述模型的程序集和与服务客户端的接口.
过了一段时间我需要为其他客户更新Customer类,所以我通过添加额外的可空属性来执行以下操作
[DataContract]
public class Customer
{
[DataMember]
public string Id {get;set;}
[DataMember]
public string Name {get;set;}
[DataMember]
public ulong? Salary {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
由于我添加了一个可以为空的数据成员,我认为我只需要共享这个新模型并与新客户签订合同,第一个客户端无需更新.
但是,我注意到我得到以下异常:
{"Interface id 'xxxxxxxx' is not implemented by object '**'"}
Run Code Online (Sandbox Code Playgroud)
在阅读了多个SO答案(这里,这里)后,我得出的结论是,客户端必须始终具有当前运行版本的服务中存在的接口和模型的确切参考.
这是一个很大的限制,因为我不应该被迫更新所有客户端.添加的额外可选参数不应强制更新旧客户端,尤其是在服务可以保证完全向后兼容的情况下.
有没有办法解决以向后兼容的方式更新服务接口而不必更新旧客户端的问题?
是否可以在Service Fabric Cluster中将服务或参与者从一个应用程序调用到另一个应用程序?当我尝试(使用正确的Uri使用ActorProxy.Create)时,我得到了"没有为界面找到MethodDispatcher"