我正在尝试将更改同步到我的服务和消费者之间的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; }
}
我不认为这是一个不常见的用例,并希望能够深入了解通常如何做到这一点?
答案 0 :(得分:0)
就服务而言,为什么不利用 CallbackContract 来通知客户发生了一些变化?
在客户端反过来DataContract可以实现INotifyPropertyChanged接口,每当更改任何属性发生,然后您调用服务。