WCF服务 - 消费者同步化

时间:2015-12-10 17:00:34

标签: c# wcf synchronization

我正在尝试将更改同步到我的服务和消费者之间的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; }
}

我不认为这是一个不常见的用例,并希望能够深入了解通常如何做到这一点?

1 个答案:

答案 0 :(得分:0)

就服务而言,为什么不利用 CallbackContract 来通知客户发生了一些变化?

在客户端反过来DataContract可以实现INotifyPropertyChanged接口,每当更改任何属性发生,然后您调用服务。