Exception handling ASP.NET 5在层中记录异常的最佳实践
我有一个使用ASP.NET5和MVC6的项目。我有几个层次:Exception handling ASP.NET 5在层中记录异常的最佳实践,exception-handling,asp.net-core,asp.net-core-mvc,serilog,Exception Handling,Asp.net Core,Asp.net Core Mvc,Serilog,我有一个使用ASP.NET5和MVC6的项目。我有几个层次: 我的演示层 我的域模型层 我的基础架构层 我的业务逻辑层 和我的数据访问层 目前,我使用依赖项注入在控制器方法中记录异常 private readonly ILogger<CustomerController> _logger; public CustomerController(ILogger<CustomerController> logger) { _logger = logger; }
- 我的演示层
- 我的域模型层
- 我的基础架构层
- 我的业务逻辑层
- 和我的数据访问层
private readonly ILogger<CustomerController> _logger;
public CustomerController(ILogger<CustomerController> logger)
{
_logger = logger;
}
public bool TestLog()
{
_logger.LogError((int)LoggingEvents.LIST_ITEMS, "Test info #543434");
return true;
}
专用只读ILogger\u记录器;
公共客户控制器(ILogger记录器)
{
_记录器=记录器;
}
公共bool测试日志()
{
_logger.LogError((int)LoggingEvents.LIST_项,“测试信息”543434);
返回true;
}
在我的其他层(如我的数据访问层)中使用记录器的最佳实践是什么?如果您想记录未处理的异常,您可能应该添加一个中间件来处理该异常。您可以在这个SO答案中看到一个示例:最佳实践是为每个组件注入自己的记录器,并让每个组件都做自己的日志记录 如果您认为这对您的应用程序来说太过嘈杂,那么您可以更改命名空间部分的详细级别,以便您只获得控制器的
信息
级别日志,以及其他所有内容的警告
(或更糟):
loggerFactory.AddConsole(new ConsoleLoggerSettings()
{
Switches = new Dictionary<string, LogLevel>()
{
["MyNamespace.Services"] = LogLevel.Warning,
["MyNamsepace.Controllers"] = LogLevel.Information
}
});
loggerFactory.AddConsole(新的ConsoleLogger设置()
{
开关=新字典()
{
[“MyNamespace.Services”]=LogLevel.Warning,
[“MyNamsepace.Controllers”]=LogLevel.Information
}
});
最好仅在应用程序层(控制器、应用程序服务,但不包括域服务)中使用ILogger
如果您想在域服务/存储库中添加日志记录,最好为其创建装饰器。只有将接口从其实现中抽象出来,并在任何地方使用/注入接口时,这才有效)
但是,对装饰器的使用有一些限制。您可以在调用公共接口中定义的方法之前和之后进行日志记录。不在电话里
为什么要避免将记录器记录/注入服务?
耦合
您应该避免在域对象中注入ILogger
,因为这会将域与ASP.NET核心日志框架/基类相耦合。但是,您始终可以定义自己的记录器接口,以便在您的域中使用它,并将其作为ILogger
的包装器实现
坚实的原则
S在S中,OLID原则代表SRP(单一责任原则),并表示一个对象应该只有一个责任。在一个对象中进行日志记录、持久化或业务逻辑违反了这一原则
但最终,你必须权衡开发成本和由此获得的收益。如果它是一个长期存在的应用程序(将在未来10年左右使用)和一个复杂的应用程序,那么登录为decorators肯定是有意义的。如果这是一个只有几周开发时间的小项目,那么这种抽象的好处可能不会超过成本。“因为它将您的域与ASP.NET核心日志记录框架/基类相结合”–ASP.NET核心中包含的ILogger接口已经非常通用,并且对其他实现开放;这里真的没有太多的耦合。它也在扩展名称空间(不是ASP.NET)中,所以它是一个单独的实体,实际上被认为是直接改编成.NET内核的。@poke:是的,但是如果接口要更改,它会破坏整个域。当您有自己的接口时,只有在您修改它时它才会中断。如果.NET核心记录器接口发生更改,则只有围绕它的包装器/提供程序会失败,这不是问题,因为它是基础架构,并且不在您的域内。但这取决于公司/开发人员来决定由谁来推动抽象:我不知道为什么有人对此投了反对票?我认为,假设依赖注入也将在其他层中使用,这可能会改进答案。