我有一个带有简单日志服务的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的构造函数中。但是:
哪里是让我的所有控制器都能使用该服务的合适位置?
答案 0 :(得分:3)
将它放在构造函数中。您甚至可以将其放在BaseController
。
理想情况下,您将使用依赖注入并将其置于您的控制器上。如果您的IoC容器支持,控制器可以具有参数。
private readonly ILogService logService;
public MyController(ILogService logService)
{
this.logService = logService;
}
答案 1 :(得分:1)
我不会将它添加到基本控制器,原因只是它听起来好像你只是零星地使用它。我会将其添加为Daniel White在控制器的构造函数中建议的。如果它看起来好像你在大多数控制器中使用它,那么我会考虑将它移到基地。