域层日志接口

本文关键字:接口 日志 | 更新日期: 2023-09-27 18:09:45

在我的域层中有一些非常昂贵的业务逻辑,必须跟踪其中的数据,以便了解如果发生故障会发生什么。因此,我想声明一个简单的日志接口:

public interface ILogger {
    void Log(LogEntry entry);
}

现在我的问题是-这个接口属于哪里?当然,日志记录可能是一个基础设施问题(还有一点跨层问题),但是如果我把它放在基础设施层,我的域服务就不能访问它。如果我把它放在域层,我就引入了登录到我的域的概念,这感觉很尴尬。

我已经在使用CQRS中的某些概念了;在我的应用程序中使用EventSourcing,然而,为域服务中数据发生的所有事情抛出事件似乎有点小题大做(特别是如果数据陷入一种状态,直到进行进一步转换才由域服务返回)

域层日志接口

这里有一些选项

  1. 使用修饰符。你说你已经在使用CQRS了,所以给你想记录的命令/查询添加装饰器。缺点是,您只能在执行命令/查询之前和之后记录日志,而不能在执行期间记录日志。而且我不确定这种方式是否很容易记录你的事件。

  2. 使用你的接口。如果您选择这个路径,那么您的ILogger接口确实应该在域层中,因为域将需要一个实现您的日志记录器需求的组件,因此域层是定义该接口的层。它的实现必须在其他地方,在基础设施层听起来很好。

[…我的域名服务无法访问它

为什么不呢?ILogger应该存在于基础设施层,但是谁说域层不能访问基础设施成员呢?

据我所知,基础设施是一个与无关的非特定于域的代码,它解决了诸如I/O、网络、数据库访问等常见问题。日志是一个基础设施问题。

基础架构代码应该实现或提供跨层软件块,并且它可能提供基于基础架构的ILogger实现。如果您的域需要某种特定的日志记录代码,那么您将提供在域层中实现的SomeDomainLogger

我不知道你是否已经使用了控制反转,因为这是加载这种基础结构代码实现的最佳方式。

据我所知,域层只负责业务规则。ILogger是否与任何业务规则相关?我不这么想。这些设计问题的根本问题是我们要记录和使用ILogger的地方。如果我们在表示层和其他层中放置日志记录,只需抛出异常并在这一层捕获这些异常,就不需要在域层中放置ILogger。