2

このメソッドを含む汎用リポジトリがあります。

public void Delete<T>(T item) where T : EntityBase

一部のオブジェクトに論理的な削除動作を追加しようとしています。すなわち。削除してもデータベースから削除されませんが、代わりに abool Deletedが設定されfalse、特定のパラメーターがそれらを含めるように設定されていない限り、クエリに表示されなくなります。一般に、アプリケーションはそこに存在しないかのように動作しますが、ブール値を再度反転することでこれらのアイテムを復元できる管理ビューを除きます。私の問題は、オブジェクトをこのメソッドに渡す際に、EntityBase多くのクラスがそれを必要としないため、このソフト削除の動作を持たない として処理されることです。SoftDeleteEntityBaseクラスを拡張しEntityBaseてソフト削除の動作を追加しますが、ブール値を取得できるようにオブジェクトをキャストするクリーンな方法が見つかりません。私の最初の考えはこれでした:

public void Delete<T>(T item) where T : EntityBase
{
    if (item is SoftDeleteEntityBase)
    {
        ((SoftDeleteEntityBase)item).Deleted = true;
        Update<T>(item);
    }
    else
    {
        db.Set<T>().Remove(item);
    }
}

しかし、それは私にエラーを与えます"Cannot convert type T to SoftDeleteEntityBase"

どうすればそのブールに到達できますか?

4

2 に答える 2

2

この短い解決策はどうですか。ただし、リポジトリの設計を変更することを検討してください

SoftDeleteEntityBase itemAsSoft = item as SoftDeleteEntityBase;
if (itemAsSoft != null)
{
    itemAsSoft.Deleted = true;
    Update(itemAsSoft);
}

あなたのコンテキストはわかりませんが、ラップアラウンドジェネリックを使用したこのソリューションはどうですか

void Main()
{
    Delete(new Base()); // called with base
    Delete(new Derived()); //called with derived
}
public void Delete(Base item)
{
    Console.WriteLine ("called with base");
    //one logic
    GenericDelete(item);
}

public void Delete(Derived item)
{
    Console.WriteLine ("called with derived");
    //another logic
    GenericDelete(item);
}

public void GenericDelete<T>(T item)
{}

public class Base
{}

public class Derived : Base
{}
于 2013-03-28T17:23:48.480 に答える
1

ポリモーフィズムを活用するのが理想的です。EntityBaseクラスはメソッドを持つことができますDelete。それと他の実装は、ハード削除を行うことを選択できます。クラスはそのSoftDeleteEntityBaseメソッドをオーバーライドし、代わりにDeletedフィールドを完全に削除する代わりに設定することを選択できます。次に、このメソッドは、派生型が何であるかを気にする必要はありません。呼び出すだけでDelete、クラスに選択させることができます。

于 2013-03-28T17:24:46.180 に答える