4

挿入/表示および更新に使用されるフォームがあります。編集モード ( update ) でコントローラーにバックを渡すときBO、データストアへの更新を実行するために、プロパティ値が変更されたかどうかを確認する最善の方法は何ですか?

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

コントローラーから顧客オブジェクトが返されます。更新を実行するには、オブジェクトがダーティかどうかを確認する必要があります。クライアントから送信されたオブジェクトは、コントローラーから送信されたオブジェクトと比較する必要があると思います。

CustomerController.Save(customer)

これは通常どのように行われますか?

4

4 に答える 4

3

良い方法は、オブジェクトに IsDirty フラグを設定し、設定可能なすべてのプロパティが変更された場合にそのフラグを更新することです。オブジェクトのロード時にフラグを false に初期化します。

プロパティの例は次のようになります。

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

その後、オブジェクトを取得したらCustomer.IsDirty、データベースへの変更をコミットする必要があるかどうかを簡単に確認できます。そして、追加のボーナスとして、結果のテキストからユーモアを得ることができます:)(ああ、それらの汚い顧客

オブジェクトが変更されているかどうかに関係なく、オブジェクトを常に保存することもできます。私の好みは、フラグを使用することです。

于 2008-11-06T16:40:53.307 に答える
3

INotifyPropertyChangedインターフェイスを見てください。実装方法の詳細については、こちらを参照してください。

于 2008-11-06T17:05:51.413 に答える
1

「ダーティ フラグ アプローチ」(単純な形式) は、値型 (int、bool、...) および文字列に対して機能しますが、参照型に対しては機能しないことに注意してください。たとえば、プロパティのタイプがList<int>orAddressの場合、セッター メソッドを呼び出さずに「ダーティ」にすることができます (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);
于 2008-11-06T17:25:47.897 に答える
1

私は専門家ではありませんが、オブジェクトにブール フラグ プロパティを使用して、それがダーティであることを示します。私は答えに打ちのめされました笑。

于 2008-11-06T16:45:32.050 に答える