1

我正在尝试将实际服务数据与服务功能分开,因此将数据作为包含多个属性(数据成员)的数据合同返回。客户端代码是使用 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
}

我希望数据合约代理充当服务器数据合约的透明代理,但它似乎完全不受约束。

非常感谢,干杯,

罗莫特

4

2 回答 2

2

WCF 不会神奇地生成与服务器端对象的连接。它只是调用您的 ServiceContract 中定义的任何方法并将数据返回给您。除此之外没有其他沟通渠道。

因此,在您的场景中,您将需要一个双工服务(请参阅:http: //msdn.microsoft.com/en-us/library/cc645027%28VS.95%29.aspx),该服务通过从服务器手动。

于 2010-01-25T15:32:11.897 回答
1

不要将 DataContract 视为“透明代理”,它更像是一个接口

仅仅因为两个类实现了相同的接口,并不意味着它们做的事情完全相同。DataContract 的客户端和服务器端也是如此。

客户端(此处)是基于 DC 生成的,还包括对 DataBinding 有帮助的方面,例如 INPC 和 ObservableCollections,就是这样,没有什么魔力。例如,如果您的服务器端对象上有一些计算属性,则该逻辑将不会出现在客户端上。

如前所述,如果您需要服务器在客户端调用事件,您将需要某种双向绑定/服务,没有其他方法(除了通过轮询服务器等来模拟它) .)

于 2010-01-25T15:46:33.283 回答