У меня есть форма, которая используется для вставить / отобразить и Обновить. В режиме редактирования (Обновить), когда я передаю свой BO обратно контроллеру, как лучше всего проверить, были ли изменены какие-либо значения свойств, чтобы выполнить обновление в хранилище данных?
textbox1.text = CustomerController.GetCustomerInformation(id).Name
Контроллер возвращает объект клиента. Мне нужно проверить, грязный ли объект, чтобы выполнить обновление. Я бы предположил, что объект, отправленный от клиента, должен быть сравнен с тем, который был отправлен с контроллера, когда я это сделаю:
CustomerController.Save(customer)
Как это обычно делается?





Хороший способ - установить на объекте флаг IsDirty и все настраиваемые свойства обновлять этот флаг в случае их изменения. Инициализируйте флаг в false при загрузке объекта.
Пример свойства будет выглядеть так:
public string Name {
get { return _name; }
set {
_name = value;
_isDirty = true;
}
}
Затем, когда вы вернете объект, вы можете просто проверить Customer.IsDirty, чтобы узнать, нужно ли вам зафиксировать изменения в базе данных. А в качестве дополнительного бонуса получится юмор из полученного текста :) (о, эти грязные клиенты)
Вы также можете всегда сохранять объект независимо от того, был ли он изменен, я предпочитаю использовать флаг.
Поместите свойство IsDirty в объект BaseObject, от которого унаследуется клиент.
Однако свойства объекта Customer должны знать, чтобы обновить флаг.
ах, правда. Я думал по-другому ... что если одно свойство грязное, с таким же успехом можно обновить их все. Поскольку вы будете выполнять ОБНОВЛЕНИЕ в таблице клиентов.
@vfilby: это не меняет полезности наличия IsDirty в базовом классе всех ваших бизнес-объектов.
если я устанавливаю свойства в DAL и передаю объект контроллеру, который затем передает его в форму, на уровне формы он уже грязный .. нет? Поскольку я уже установил свойства в DAL. Затем мне нужно будет сбросить dirty на false на уровне контроллера.
@Saif: ваш DAL может загружать все свойства и устанавливать для флага IsDirty значение false.
@Harper Shelby: Да, просто замечу, что вам все еще нужно обновить флаг в дочерних классах.
Я не эксперт, но я бы использовал свойство логического флага для объекта, чтобы указать, что он грязный. Меня опередили до ответа, лол.
Взгляните на интерфейс INotifyPropertyChanged. Более подробное объяснение того, как это реализовать, доступно здесь.
Обратите внимание, что «подход грязного флага» (в его простой форме) работает для типов значений (int, bool, ...) и строк, но не для ссылочных типов. Например. если свойство имеет тип List<int> или Address, вы можете сделать его «грязным», не вызывая метод установки (myCust.Address.City = "..." вызывает только метод получения).
В этом случае вам может пригодиться подход, основанный на отражении (добавьте следующий метод в свой 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);
Ответы - хороший первый шаг, но что, если для свойства будет установлено исходное значение перед фиксацией в базе данных? Тогда объект больше не грязный. Это то, на что пока не отвечает ни один из ответов ...