我有一個基類,其中包括以下功能的BLL:IsDirty標記模式
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屬性來測試以查看是否需要發出更新。如果至少有一個屬性發生更改,則保存到數據庫。這適用於大多數類型,但集合和列表可以在不使用set的情況下更改。我寫了一個包裝的收集到有可能變更進行測試列表中的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爲標誌更新。
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。這是更好的方法,我將如何實施?
我覺得很髒。 – jgauffin
@jgauffin讓我解決這個問題:jgauffin =!jgauffin。 – LarsTech