Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF服务消费者同步_C#_Wcf_Synchronization - Fatal编程技术网

C# WCF服务消费者同步

C# WCF服务消费者同步,c#,wcf,synchronization,C#,Wcf,Synchronization,我正在尝试在我的服务和它的消费者之间同步对DataContract的更改。我在设计一种可维护的通知财产变化的方式时遇到了困难 例如,我希望保持以下同步: [DataContract] public class MyObject { [DataMember] public Guid Id { get; private set; } = Guid.NewGuid(); [DataMember] public int Foo { get; set; } [D

我正在尝试在我的服务和它的消费者之间同步对
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
}
我在使用此方法时遇到了一个问题,因为序列化程序无法确定如何序列化
对象

我现在不知道如何处理更改通知。我可以看到两种方法,但我希望有更好的解决办法

我可以通知消费者/服务已进行更改。然后,它可以向服务/消费者请求更改的
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接口,只要对任何属性进行了更改,就可以调用服务。

我使用的是
CallbackContract
。我遇到的问题是如何以可扩展和可维护的方式通知更改。在
CallbackContract
更改中为每个属性添加方法是不可扩展的,因为在该行中添加的任何其他属性都需要一个新方法,这将破坏客户端。请创建用于登记属性的枚举,并在callback方法中添加类型为enum的传统参数,指示应该通知哪个属性关于改变。