exception-handling - ASP.NET 5 分层记录异常的最佳实践

标签 exception-handling asp.net-core asp.net-core-mvc serilog

我有一个使用 ASP.NET 5 和 MVC 6 的项目。我有几个层:

  • 我的表现层
  • 我的领域模型层
  • 我的基础设施层
  • 我的业务逻辑层
  • 还有我的数据访问层。

目前,我使用依赖注入(inject)在我的 Controller 方法中记录异常。

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<T>仅在您的应用程序层( Controller 、应用程序服务 - 但不是域服务)。

如果您想在域服务/存储库周围添加日志记录,最好为其创建装饰器。仅当您从接口(interface)的实现中抽象出接口(interface)并在各处使用/注入(inject)接口(interface)时,这才有效。

但是,您可以使用装饰器执行的操作是有限制的。您可以在调用公共(public)接口(interface)中定义的方法之前和之后进行记录。不在电话内。

为什么要避免将记录器记录/注入(inject)到服务中?

耦合

你应该避免注入(inject) ILogger<T>在您的域对象中,因为这将您的域耦合到 ASP.NET Core 日志记录框架/基类。但是,您始终可以定义自己的记录器接口(interface)以在您的域中使用它,并将其实现为 ILogger<T> 的包装器。 .

SOLID原则

SOLID原则中的

S代表SRP(Single Responsibility Principle),表示一个对象应该只承担一个且只有一个职责。将日志记录和持久性或业务逻辑放入一个对象中违反了这一原则。

但最后,您必须权衡开发成本和您从中获得的 yield 。如果它是一个长期存在的应用程序(将在未来 10 年左右使用)并且是一个复杂的应用程序,那么作为装饰器登录肯定是有意义的。如果它是一个只有几周开发时间的小项目,这种抽象的好处可能不会超过成本。

关于exception-handling - ASP.NET 5 分层记录异常的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35555310/

相关文章:

Spring 5 响应式(Reactive)异常处理

exception - 异步异常的嵌套屏蔽

java - 错误页面返回状态代码 200 默认响应

c# - 带有 IHtmlHelper 引用的自定义 Razor 助手

c# - ASP.NET Core 2.2 JWT 认证

c# - AppDomain.UnhandledException 处理程序不会在单元测试中触发

c# - ASP.NET 核心 FromQuery 获取内部带有点号的无效参数

c# - Microsoft.Data.SqlClient与System.Data.SqlClient

c# - Entity Framework Core 2.1 group by 无法正常工作

c# - 操作无法完成。无效指针 - Visual Studio 2015 Update 3