MVC3:在记录器类上添加依赖项的适当位置?

时间:2011-09-02 01:21:02

标签: asp.net-mvc-3 logging dependency-injection

我有一个带有简单日志服务的MVC3应用程序。我使用Microsoft的Unity Dependency Injection容器调用我的所有服务。

对于大多数方法,我忽略了异常;它们被一个顶级错误处理程序捕获,它对它们进行分类并决定是否记录它们,生成我想要的HTTP响应,并在错误控制器上调用一个动作方法来返回我的custiom错误页面。

有时候,我不想这样做;我想处理它发生的异常,例如在我的控制器中。在这种情况下,我想在替换适当的默认值并继续控制器的逻辑之前记录错误。

我在一个地方做到了:在我的控制器中,我补充道:

var logService = DependencyResolver.Current.GetService<ILogService>();
try { /* something indeterminate */ }
catch ( Exception ex ) {
    logService.LogException(category, ex);
    /* do something else instead */
}

现在我想在那个控制器中第二次这样做(因为它发生在后面的同一个方法中)。一旦我再次这样做,我认为是时候重构了,因为我正在重复自己。

让我的记录器可用于控制器的最佳方法是什么?我的控制器都继承自定义的ControllerBase;我的第一个想法是将它添加到ControllerBase的构造函数中。但是:

  1. 目前我在ControllerBase中没有构造函数,
  2. 我有点担心引用DI容器 控制器打破了控制器的隔离,否定了 DI的价值开头,和
  3. 我认为我不能通过 记录到ControllerBase的构造函数,因为(因为我 理解它,请纠正我,如果错了)控制器只能有 无参数构造函数,因此没有办法传递任何东西 它们。
  4. 哪里是让我的所有控制器都能使用该服务的合适位置?

2 个答案:

答案 0 :(得分:3)

将它放在构造函数中。您甚至可以将其放在BaseController

理想情况下,您将使用依赖注入并将其置于您的控制器上。如果您的IoC容器支持,控制器可以具有参数。

private readonly ILogService logService;
public MyController(ILogService logService) 
{
   this.logService = logService;
}

答案 1 :(得分:1)

我不会将它添加到基本控制器,原因只是它听起来好像你只是零星地使用它。我会将其添加为Daniel White在控制器的构造函数中建议的。如果它看起来好像你在大多数控制器中使用它,那么我会考虑将它移到基地。