我有一个使用 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/