如何将数据上下文传递给自定义操作过滤器?

时间:2012-09-14 15:11:33

标签: asp.net-mvc

我创建了一个自定义操作过滤器来执行审计跟踪的日志记录。我将我的日志记录代码添加到public override void OnActionExecuting(ActionExecutingContext filterContext)

我的问题是,如何将我的EF dbContext传递给此方法?我想编写一个单独的动作过滤器,并在其他开发项目中重复使用它,而无需为每个项目更改dbcontext。

如果这不是推荐的做法,我该怎么办?

1 个答案:

答案 0 :(得分:0)

如果我正在做这样的事情,我想我会在已经知道数据上下文并将审计模型传递给它的服务层中实现通用审计日志记录方法。这样,如果需要记录应用程序的不同部分(甚至可能与控制器无关),则不必重新实现任何操作。

或者,如果您想坚持使用控制器,您可以为数据上下文创建一个接口

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

创建一个与System.Web.Mvc.Controller

一起实现的BaseController
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中执行所有操作,但我只是在板上扔东西,以防您看到可以正常工作的内容对你而言。