WCF服务消费者同步
本文关键字:同步 消费者 服务 WCF | 更新日期: 2023-09-27 18:26:23
我正在尝试在我的服务和它的消费者之间同步对DataContract
的更改。我在设计一种可维护的属性更改通知方式时遇到了问题。
例如,我想保持以下同步:
[DataContract]
public class MyObject
{
[DataMember]
public Guid Id { get; private set; } = Guid.NewGuid();
[DataMember]
public int Foo { get; set; }
[DataMember]
public string Bar { get; set; }
}
我最初的方法是使用一个带有属性名和对象的事件,例如:
public delegate void PropertyChangedEventHandler(Guid id, string propertyName, object value);
服务&消费者可以订阅属性更改:
myObject.PropertyChanged += MyObjectPropertyChanged;
// MyObject would raise the property change inside of the property set.
private void MyObjectPropertyChanged(Guid id, string propertyName, object value)
{
// Depending on which end is listening the service can send
// the change to the consumer or vica versa
}
我在使用此方法时遇到了一个问题,因为序列化程序无法确定如何序列化object
。
我现在不知道如何处理变更通知。我可以看到两种方法,但我希望有更好的解决方案。
我可以通知消费者/服务部门已经进行了更改。然后,它可以向服务/消费者请求更改后的MyObject
。如果多个使用者同时更改同一对象(因为服务的并发性设置为多个),我认为这是一个问题。这可能会导致一个消费者的零钱丢失。
第二种方法是创建一个EventArgs
,它镜像MyObject
的属性,您可以根据EventArgs
传递的属性名称访问该属性,并同步本地副本。这将允许两个消费者更改不同的属性,而不必担心其中任何一个会丢失。然而,这感觉像是大量重复的代码。随着MyObject
的增长,大量未使用的数据也在四处传递。承认在阅读和设置合适的属性方面有反思的空间。
例如:
public class MyObjectPropertyChangedEventArgs : EventArgs
{
public Guid Id { get; set; }
public string PropertyName { get; set; }
// Then one of the relative property below would be set to the new value
public int Foo { get; set; }
public string Bar { get; set; }
}
我不认为这是一个不常见的用例,我希望能深入了解这通常是如何实现的?
就服务而言,为什么不利用CallbackContract来通知客户端发生了一些更改
在客户端,DataContract可以实现INotifyPropertyChanged接口,只要对任何属性进行更改,就可以调用服务。