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 回答