IsDirty-Flag-Muster

Ich habe eine Basis-Klasse für eine BLL, enthält die folgende Funktion:

    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;
        }
    }

In die Klassen Erben von der Basisklasse verwende ich diesen als wrapper um das Objekt, wie zum Beispiel:

    public string UserName
    {
        get { return _userName; }
        set { SetField(ref _userName, value); }
    }

Ich die IsDirty-Eigenschaft, um zu testen, um zu sehen, wenn ich auf eine Update. Wenn mindestens einer der Eigenschaften, die änderungen dann speichern Datenbank. Dies funktioniert für die meisten Arten jedoch Sammlungen und Listen ändern können, ohne die mithilfe von set. Ich schrieb einen wrapper für die Collection ein IsDirty-flag auf der Liste, die geprüft werden könnte für den Wandel:

    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;
        }
    }
}

Das problem ist, dass ich jetzt habe zum test sowohl die Classe die IsDirty-Eigenschaft und jede CollectionChangeTracked.IsDirty-flags für updates. Ich könnte create-Methode, die den test durchführt, in einem Ort wie:

    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;
    }

Aber es scheint, wie ich sollte in der Lage zu kommen mit eine saubere Lösung würde es ermöglichen, dass eine Klasse, die enthält die Sammlung abonnieren, um eine änderung der IsDirty der CollectionChangeTracked Objekt und aktualisieren Sie die IsDirty-basierend auf dieser änderung zu. Ist das der bessere Ansatz ist, und wie würde ich das umsetzen?

  • Ich fühle mich SO schmutzig.
  • Lassen Sie mich fix das für dich: jgauffin = !jgauffin.
InformationsquelleAutor Josh | 2012-10-12
Schreibe einen Kommentar