6

次の関数を含む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を更新できるようにする、よりクリーンなソリューションを考え出すことができるはずです。これはより良いアプローチですか、そしてどのように実装しますか?

4

1 に答える 1

3

ObservableCollection<T>イベントへのレジスターを使用してCollectionChanged、イベントが発生したときにIsDirtyフラグをマークすることができます。

...

ObservableCollection<int> myCollection = new ObservableCollection<int>();
myCollection.CollectionChanged += OnCollectionChanged;

...

public void OnCollectionChanged( Object sender, NotifyCollectionChangedEventArgs e )
{
   IsDirty = true;
}
于 2012-10-12T19:11:53.177 に答える