汎用リポジトリの実装があります。私はasp.netmvcc#、コードファーストエンティティフレームワークを使用しています。
ISoftDeleteという名前のインターフェイスを作成しました。
public interface ISoftDelete
{
bool IsDeleted { get; set; }
}
次のように、ベースリポジトリにDeleteとGetByIdを実装しました。
public virtual void Delete(T entity)
{
if (entity is ISoftDelete)
{
((ISoftDelete)entity).IsDeleted = true;
}
else
{
dbset.Remove(entity);
}
}
public virtual T GetById(long id)
{
T obj = dbset.Find(id);
if (obj is ISoftDelete)
{
if (((ISoftDelete)obj).IsDeleted)
return null;
else
return obj;
}
else
{
return obj;
}
}
さて、2つの質問があります。
1)このアプローチは良いアプローチですか?パフォーマンス関連の問題はありますか?
2)ベースリポジトリの元のGetAll関数は次のようになります。
public virtual IEnumerable<T> GetAll()
{
return dbset.ToList();
}
TがISoftDeleteから派生している場合、IsDeleted == falseであるレコードを一覧表示するには、どのように変更すればよいですか?
ありがとうございました!