Мне нравится идея расширения на клиентских классах, которые являются контрактами данных служб WCF с использованием частичных классов. Но я столкнулся с проблемой, которая значительно портит сторону.Подписка на PropertyChanged of DataContract proxy classe службы WCF
Представьте на стороне сервера, у меня есть класс:
[DataContract]
public class SolidObject
{
[DataMember]
public Point Position { get; set; }
[DataMember]
public Size Size { get; set; }
}
На стороне клиента у меня есть прокси-класс сгенерированного, который используется там в слой бизнес-логики. В соответствии с потребностями бизнес-логики я продлить это так:
public partial class SolidObject
{
public Rect Bounds { get { return new Rect(Position.X - Size.Width/2, Position.Y - Size.Height/2, Size.Width, Size.Height); }}
}
Теперь я хочу, чтобы убедиться, что в любое время либо установки или изменения размера, то Bounds Chage событие вызывается. Это легко сделать по коду:
PropertyChanged += (sender, e) =>
{
if ((e.PropertyName == "Position") || (e.PropertyName == "Size")) PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Bounds"));
};
Вопрос в том, где хорошее место для размещения этого кода.
Если объекты не были созданы вызовом службы, я бы поместил его в конструктор. Но службы WCF игнорируют конструкторы на стороне клиента, см. constructor not showing up in my WCF client, serialization problem?.
Теперь, после ответа службы, моя программа выполняет поиск по иерархии контрактов данных, получает желаемые объекты и добавляет обработчики событий. Но я не думаю, что это правильно.
Так что мне интересно, где это лучше делать или, может быть, рассуждать о том, что весь подход должен быть изменен. Любые идеи оценили.
Отлично! Это то, что я искал. Единственное замечание заключается в том, что он исключил исключение, пока я не сделал этот метод общедоступным. –
ОК, я отредактировал ответ, чтобы включить это исправление. –
Это замечательно! Имел аналогичную проблему, и это ее решило. Благодаря! – ScottCher