Мне нравится идея расширения на стороне клиента классов, которые являются контрактами данных служб 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 игнорируют конструкторы на стороне клиента, смотрите, как конструктор не отображается в моем клиенте WCF, проблема сериализации? .
Теперь, сразу после ответа службы, моя программа просматривает иерархию контрактов данных, получает нужные объекты и добавляет обработчики событий. Но я не думаю, что это правильно.
Так что мне интересно, где это лучше сделать или, может быть, рассуждать, что весь подход должен быть изменен. Любые идеи приветствуются.