ソフト削除をサポートする EF Code First ソリューションがあるため、エンティティを IsDeleted としてマークし、データベースから削除しません。削除済みとしてマークされたエンティティが API ユーザーに返されないように、関連オブジェクトのコレクション (遅延読み込み) を調整したいと考えています。
これが私が使用する簡単なアプローチです:
public class FilteredCollection<T> : ICollection<T> where T : DeletableEntity
{
private List<T> _listWithDeleted = new List<T>();
protected IEnumerable<T> FilteredItems
{
get { return _listWithDeleted.Where(e => e.IsDeleted == false); }
}
protected bool _IsReadOnly;
public virtual T this[int index]
{
get
{
return FilteredItems.ToList()[index];
}
set
{
FilteredItems.ToList()[index] = value;
}
}
public virtual int Count
{
get
{
return FilteredItems.Count();
}
}
public virtual bool IsReadOnly
{
get
{
return _IsReadOnly;
}
}
public virtual void Add(T entityObject)
{
_listWithDeleted.Add(entityObject);
}
public virtual bool Remove(T entityObject)
{
if (FilteredItems.Contains(entityObject))
{
entityObject.IsDeleted = true;
return true;
}
else
{
return false;
}
}
public bool Contains(T entityObject)
{
return FilteredItems.Contains(entityObject);
}
public virtual void CopyTo(T[] entityObjectArray, int index)
{
var list = FilteredItems.ToList();
list.CopyTo(entityObjectArray, index);
}
public virtual void Clear()
{
foreach (var item in _listWithDeleted)
{
item.IsDeleted = true;
}
}
public virtual IEnumerator<T> GetEnumerator()
{
return FilteredItems.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return FilteredItems.GetEnumerator();
}
}
ICollection を実装したので、オブジェクトを内部的にフィルタリングします。ICollection の代わりにこのクラスを使用するので、フィルター処理されたエンティティが返されます。いくつかのテストを行ったところ、うまく機能しているように見えますが、このソリューションには満足していません。
このアプローチの欠点を教えてください。または、より良い方法を知っている場合は提案してください。
よろしくお願いします。
-ペトロ