Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 MVC3:在记录器类上添加依赖项的合适位置?_Asp.net Mvc 3_Logging_Dependency Injection - Fatal编程技术网

Asp.net mvc 3 MVC3:在记录器类上添加依赖项的合适位置?

Asp.net mvc 3 MVC3:在记录器类上添加依赖项的合适位置?,asp.net-mvc-3,logging,dependency-injection,Asp.net Mvc 3,Logging,Dependency Injection,我有一个带有简单日志服务的MVC3应用程序。我的所有服务都是使用Microsoft的Unity Dependency Injection容器调用的 对于大多数方法,我忽略异常;它们被捕获在一个顶级错误处理程序中,该处理程序对它们进行分类并决定是否记录它们,生成我想要的HTTP响应,并在错误控制器上调用一个操作方法以返回我的custiom错误页面 有时候,虽然,我不想那样做;我想在发生异常的地方处理异常,例如在我的控制器中。在这种情况下,我希望在替换适当的默认值并继续控制器的逻辑之前记录错误 我在

我有一个带有简单日志服务的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 */
}
var logService=dependencysolver.Current.GetService();
尝试{/*不确定的事物*/}
捕获(例外情况除外){
logService.LogException(类别,ex);
/*做点别的吧*/
}
现在,我想在该控制器中再做一次(正如它发生的那样,稍后使用相同的方法)。当我再次这样做时,我发现是时候重构了,因为我在重复我自己

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

  • 目前我在ControllerBase中没有构造函数
  • 我有点担心在 控制器断开控制器的隔离,使 开始时DI的值,以及
  • 我想我不能通过考试 记录到ControllerBase的构造函数中,因为 理解它,请纠正我,如果我错了)控制器只能有 无参数构造函数,因此无法将任何内容传递给 他们

  • 在哪里可以为我的所有控制器提供服务?

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

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

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

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

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

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

    我不会将它添加到基本控制器中,唯一的原因是它听起来好像只是偶尔使用它。我会像Daniel White在控制器的构造函数中建议的那样添加它。如果它看起来像是在大多数控制器中使用它,那么我会考虑把它移到基座。

    < P>我不会把它添加到基础控制器中,唯一的原因是听起来好像你只是偶尔使用它。我会像Daniel White在控制器的构造函数中建议的那样添加它。如果它看起来像是在大多数控制器中使用它,那么我会考虑把它移到底座上。

    那很好,天空没有落在我的头上!谢谢——我一直在看所有这些关于无参数构造函数的讨论,我认为这是MVC框架的一个限制,而不是DI容器。这很好,天空没有落到我头上!谢谢——我一直在看关于无参数构造函数的讨论,并认为这是MVC框架的一个限制,而不是DI容器。