Обнаружение изменений в значениях свойств объекта .NET? - PullRequest
4 голосов
/ 06 ноября 2008

У меня есть форма, которая используется для вставки / отображения и обновления . В режиме редактирования ( update ), когда я передаю свой BO обратно в контроллер, каков наилучший способ проверить, были ли изменены какие-либо значения свойств, чтобы выполнить обновление для хранилище данных?

textbox1.text = CustomerController.GetCustomerInformation(id).Name

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

CustomerController.Save(customer)

Как это обычно делается?

Ответы [ 4 ]

3 голосов
/ 06 ноября 2008

Посмотрите на интерфейс INotifyPropertyChanged . Более подробное объяснение того, как его реализовать, доступно здесь .

3 голосов
/ 06 ноября 2008

Хороший способ состоит в том, чтобы на объекте был установлен флажок IsDirty и чтобы все настраиваемые свойства обновляли этот флаг в случае их изменения. Инициализируйте флаг в false, когда объект загружен.

Пример свойства будет выглядеть следующим образом:

public string Name {
    get { return _name; }
    set {
        _name = value;
        _isDirty = true;
    }
}

Затем, когда вы вернете объект обратно, вы можете просто проверить, Customer.IsDirty, чтобы увидеть, нужно ли вам вносить изменения в базу данных. И в качестве дополнительного бонуса вы получите немного юмора из полученного текста :) ( ох уж эти грязные клиенты )

Вы также можете всегда сохранять объект независимо от того, был ли он изменен, я предпочитаю использовать флаг.

1 голос
/ 06 ноября 2008

Обратите внимание, что «подход грязного флага» (в его простой форме) работает для типов значений (int, bool, ...) и строк, но не для ссылочных типов. Например. если свойство имеет тип List<int> или Address, вы можете сделать его "грязным", не вызывая метод setter (myCust.Address.City = "..." вызывает только метод getter).

Если это так, то вам может пригодиться подход, основанный на рефлексии (добавьте следующий метод в свой BO):

public bool IsDirty(object other)
{
  if (other == null || this.GetType() != other.GetType())
    throw new ArgumentException("other");

  foreach (PropertyInfo pi in this.GetType().GetProperties())
  {
     if (pi.GetValue(this, null) != pi.GetValue(other, null))
       return true;
  }
  return false;
}

Вы можете использовать это так:

Customer customer = new Customer();
// ... set all properties
if (customer.IsDirty(CustomerController.GetCustomerInformation(id)))
  CustomerController.Save(customer);
1 голос
/ 06 ноября 2008

Я не эксперт, но я бы использовал логическое свойство флага для объекта, чтобы указать, что он грязный. Я был избит до ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...