在每个控制器操作之前/之后执行代码

时间:2014-10-10 11:28:16

标签: c# asp.net asp.net-mvc

我有一个ASP.NET MVC应用程序,我想记录事件。我已经有了一个包含我需要的所有工具的Log类,但是我必须实例化并明确地关闭它(因为它打开文件,所以我不能依赖GC)。我的行为如下:

public ActionResult MainMenu()
{
    CreateLog();

    // Do controller stuff
    Log(message);
    // Do more controller stuff

    CloseLog();
    return View(mModel);
}

或者我可以使用using块,但它会稍微不那么干扰,并且会因异常处理而产生麻烦。我已经阅读了ActionFilters,我可以使用它来创建和关闭我的日志,但之后我无法访问方法中的Log对象。

你有什么建议吗?我怎么能避免重复代码?

3 个答案:

答案 0 :(得分:23)

如果其他建议不起作用或者除了记录之外还需要做其他事情,请注意您可以覆盖OnActionExecuting方法(通常在基类中重用)。

// Custom controller.
public class CustomController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Do whatever here...
    }
}

// Home controller.
public class HomeController : CustomController
{
    // Action methods here...
}

答案 1 :(得分:1)

我建议您将Logger(可能是ILogger)对象作为对控制器的依赖项。您可以通过DI容器(例如Unity)控制此记录器对象的生命周期 - 如果需要,您可以将其生命周期定义为请求范围。这个问题的另一个好处是你的代码仍然可以测试。

答案 2 :(得分:0)

您可以使用模块,因为它们都位于管道中,可以为请求的核心执行提供前后处理。 BeginRequest / ActionExecuting和EndRequest / ResultExecuted。他们都提供授权挂钩。

http://msdn.microsoft.com/en-us/library/aa719858(v=vs.71).aspx