我有一个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对象。
你有什么建议吗?我怎么能避免重复代码?
答案 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