Начиная с первоначального ответа Майка, я был в состоянии придумать следующее решение.
фон
- Клиент получает данные от сервера через службы WCF.
- Ссылка на службу WCF генерируется Visual Studio с использованием «типов повторного использования в ссылочных сборках», поэтому никакая манипуляция с WCF не может быть выполнена.
- Свойство на стороне клиента приложение должно быть изменено, если какое-либо имущество, на любой из объектов, полученных от WCF изменилось (эти объекты реализации INotifyPropertyChanged)
заблаговременности
Я понимаю, что это нарушает некоторые объектно-ориентированные правила и правила ответственности, однако решение настолько короткое, настолько простое и соответствует моим текущим и ожидаемым будущим потребностям, поэтому я и пошел. Это решение менее практично, когда существует значительная логика, которая должна выполняться при каждой десериализации на стороне клиента.
[DataContract]
public class DataTransferObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[OnDeserialized]
public void OnDeserialized(StreamingContext context)
{
dynamic app = Application.Current;
if(app != null) //Prevents execution on server-side. This code is meant to only execute at the client
{
PropertyChanged += (sender, args) =>
{
app.IsAnythingDirty = true;
};
}
}
}
Ключи
- Причина, это работает динамическое ключевое слово. Вы должны использовать динамическое ключевое слово , потому что проект, содержащий DTO, не может ссылаться на проект U12 из-за круговой ссылки. Если он не может ссылаться на проект пользовательского интерфейса, компилятор не знает об IsAnythingDirty boolean.
- Проверка того, что Application.Current равно null, гарантирует, что код будет работать только на стороне клиента, а не на стороне сервера.
Непонятный вопрос. Вы ищете образцы кода, где кто-то это сделал? Можете ли вы быть более конкретными в своих намерениях? –
Я хотел задать вопрос как можно более общий. Я ищу руководство для того, где я могу подключиться к рабочему процессу WCF (атрибут где-нибудь? Поведение). В частности, я хочу подписаться на событие INotifyPropertyChanged.PropertyChanged каждого объекта, который входит в систему, чтобы я мог определить, будут ли какие-либо входящие объекты были изменены пользователем. –
Я вижу. взгляните на ответ Майка ... это может быть именно то, что вы ищете. –