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; }
}

我不认为这是一个不常见的用例,我希望能深入了解这通常是如何实现的?

WCF服务消费者同步

就服务而言,为什么不利用CallbackContract来通知客户端发生了一些更改

在客户端,DataContract可以实现INotifyPropertyChanged接口,只要对任何属性进行更改,就可以调用服务。