我正在尝试将实际服务数据与服务功能分开,因此将数据作为包含多个属性(数据成员)的数据合同返回。客户端代码是使用 svcutil /edb 生成的,它还为代理代码生成 INotifyPropertyChanged 实现。据我的测试显示,该代码不会针对服务器上发生的更改调用 PropertyChanged 事件。此外,获取属性只会返回获取数据合约代理时的属性值。
基本上,这就是我所拥有的:
(服务器端)
[ServiceContract]
public interface IControllerService
{
[OperationContract]
DataModel GetDataModel();
}
[DataContract]
public class DataModel : INotifyPropertyChanged
{
private string _state;
[DataMember]
public string State
{
set
{
if (_state != value)
{
_state = value;
OnPropertyChanged("State");
}
}
get
{
return _state;
}
}
public event PropertyChangedEventHandler PropertyChanged;
[OperationContract]
protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
(客户端)
private void Test()
{
ControllerServiceClient client = new ControllerServiceClient();
DataModel model = client.GetDataModel();
model.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(DataModelChanged);
Console.WriteLine(model.State);
// ... invoke something that forces the server to change the data model
// Output stays the same
Console.WriteLine(model.State);
}
private void DataModelChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
// This method never get called for server-side changes
}
我希望数据合约代理充当服务器数据合约的透明代理,但它似乎完全不受约束。
非常感谢,干杯,
罗莫特