2017-01-12 5 views
0

У меня есть ссылка на службу, которая использует BasicHttpBinding, но когда reference.cs генерируется с использованием VS, некоторые свойства, не реализующие RaisePropertyChanged, теперь (хотя это приемлемо), а логика в setter игнорируется/удален (что очень неприемлемо!).Сгенерированный код reference.cs с INotifyPropertyChanged

Я пробовал настраивать ссылку на службу различными способами и помещать логику в событие RaisePropertyChanged, но ничто, кажется, не устраняет это.

Любая помощь очень ценится, короткий код ниже.

Оригинальный код в службу

public class Entry : INotifyPropertyChanged 
{ 

    private string m_Firstname; 
    private string m_Foo; 

    public string Firstname 
    { 
     get { return m_Firstname; } 
     set 
     { 
      m_Firstname = value; 

      Foo = "bar"; 

      OnPropertyChanged("Firstname"); 
     } 
    } 

    public string Foo 
    { 
     get { return m_Foo; } 
     set { m_Foo = value; } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string propertyName) 
    { 
     System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
     if ((propertyChanged != null)) 
     { 
      propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
     } 
    } 

} 

Сгенерированный код в Reference.cs

/// <remarks/> 
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1586.0")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.domain.com/")] 
public partial class Entry : object, INotifyPropertyChanged { 

    private string firstnameField; 
    private string foo; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Order=1)] 
    public string Firstname { 
     get { return this.preferredContactMethodField; } 
     set { 
      this.firstnameField = value; 
      this.RaisePropertyChanged("Firstname"); 
     } 
    } 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute(Order=2)] 
    public string Foo { 
     get { return this.foo; } 
     set { 
      this.foo= value; 
      this.RaisePropertyChanged("Foo"); 
     } 
    } 


    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChanged(string propertyName) { 
     System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged; 
     if ((propertyChanged != null)) { 
      propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 

Обратите внимание на попытку установить Foo в инкубаторе ПгвЬЫате пошел и RaisePropertyChanged в Foo сеттер появился.

Насколько я вижу, это неотъемлемая часть процесса, который генерирует файл Reference.cs, и я ничего не могу сделать, чтобы мой исходный код вытягивал - особенно попытка установить Foo, это правильно?

Заранее спасибо

ответ

0

При добавлении ссылки на службу, типы клиентов сгенерированы автоматически из интерфейса сервиса. Ваша конкретная логика является частью внутренней реализации, о которой клиент обслуживания ничего не знает.

Если вы хотите иметь такое поведение на клиенте, вы не должны вручную изменять сгенерированный код. Он будет перезаписан, когда вы обновите ссылку.

Единственное решение, которое надежно работает, состоит в том, чтобы изолировать типы обслуживания в отдельном сборке и использовать этот сборник в вашей служебной ссылке. Для этого нажмите кнопку Advanced ... при создании или обновлении ссылки и включите сборку в диалоговом окне, которое открывается, добавив ее в список «Использовать типы этих сборок».

+0

К сожалению, следует упомянуть, что это веб-служба (asmx) и стандартная справочная служба, а не .svc, что является единственным способом, которым я могу это сделать. – user1919214

+0

Вы также можете добавить ссылку на службу с помощью службы asmx. – Sefe