2

監査証跡のロギングを実行するカスタム アクション フィルタを作成しました。ロギング コードを に追加しましたpublic override void OnActionExecuting(ActionExecutingContext filterContext)

私の質問は、EF dbContext をこのメソッドに渡すにはどうすればよいですか? 単一のアクション フィルターを作成し、プロジェクトごとに dbcontext を変更せずに他の開発プロジェクトで再利用したいと考えています。

これが推奨される方法ではない場合、どうすればよいですか?

4

1 に答える 1

0

そのようなことをしているとしたら、データコンテキストをすでに認識していて、監査モデルをサービスレイヤーに渡す一般的な監査ロギングメソッドをサービスレイヤーに実装することになると思います。このように、アプリケーションのさまざまな部分(コントローラーに関連していない可能性もあります)をログに記録する必要がある場合は、何も再実装する必要はありません。

あるいは、コントローラーだけに固執したい場合は、データコンテキストのインターフェイスを作成することもできます

public interface IDataContext<T> where T : DbContext
{
    T DataContext { get; }
}

とともに実装するBaseControllerを作成しますSystem.Web.Mvc.Controller

public class BaseController : Controller, IDataContext<YourDbContextClass>
{
    public YourDbContextClass DataContext { get { return new YourDbContextClass(); } }
}

この基本クラスをコントローラーで使用し、を介してコンテキストに到達DataContextできますが、ロギングの場合は、オーバーライドされたメソッドを使用して新しいクラスを作成できます。

public class AuditController : BaseController
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // whatever you do inside here
        // DataContext.LaDiDa
    }
}

そしてそれからあなたのものを継承します

public class HomeController : AuditController
{
    public ActionResult Index()
    {
        return View();
    }
}

これは最も簡単な解決策ではありませんが、インターフェイスをすべて一緒に失い、ですべてを実行する可能性がありますが、あなたがBaseControllerあなたのために働く何かを見つけた場合に備えて、私はボードに何かを投げています。

于 2012-09-15T23:03:18.937 に答える