次の関数を含むBLLの基本クラスがあります。
public bool IsDirty { get; protected set; }
internal void SetField<TParam>(ref TParam field, TParam value)
{
if (EqualityComparer<TParam>.Default.Equals(field, value) == false)
{
field = value;
IsDirty = true;
}
}
基本クラスを継承するクラスでは、次のように、これをSETオブジェクトのラッパーとして使用します。
public string UserName
{
get { return _userName; }
set { SetField(ref _userName, value); }
}
IsDirtyプロパティを使用して、更新を発行する必要があるかどうかをテストします。プロパティの少なくとも1つが変更された場合は、データベースに保存します。これはほとんどのタイプで機能しますが、コレクションとリストはセットを使用せずに変更できます。コレクションのラッパーを作成して、リストにIsDirtyフラグを設定し、変更をテストできるようにしました。
public class CollectionChangeTracked<T> : Collection<T>
{
public bool IsDirty {get; set;}
public CollectionChangeTracked()
{
IsDirty = false;
}
protected override void InsertItem(int index, T newItem)
{
base.InsertItem(index, newItem);
IsDirty = true;
}
protected override void SetItem(int index, T newItem)
{
base.SetItem(index, newItem);
IsDirty = true;
}
protected override void RemoveItem(int index)
{
base.RemoveItem(index);
IsDirty = true;
}
protected override void ClearItems()
{
base.ClearItems();
IsDirty = true;
}
}
}
問題は、ClasseのIsDirtyプロパティとCollectionChangeTracked.IsDirtyフラグの両方をテストして更新する必要があることです。次のような1つの場所でテストを実行するメソッドを作成できます。
public CollectionChangeTracked<ApplicationRole> RolesList
{
get { return _rolesList; }
set { SetField(ref _rolesList, value); }
}
public override bool IsDirty
{
get { return ResolveIsDirty(); }
protected set { _isDirty = value; }
private bool ResolveIsDirty()
{
bool returnValue;
if (_isDirty || RolesList.IsDirty)
returnValue = true;
else
returnValue = false;
return returnValue;
}
しかし、コレクションを含むクラスがCollectionChangeTrackedオブジェクトのIsDirtyの変更をサブスクライブし、その変更に基づいてIsDirtyを更新できるようにする、よりクリーンなソリューションを考え出すことができるはずです。これはより良いアプローチですか、そしてどのように実装しますか?