【问题标题】:Logging interface in domain layer领域层的日志接口
【发布时间】:2014-06-23 06:53:11
【问题描述】:

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

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

现在我的问题是——这个接口属于哪里?当然,日志记录可能是一个基础设施问题(以及一点跨层问题),但如果我将它放在基础设施层,我的域服务将无法访问它。如果放到域层,我引入了登录到我的域的概念,感觉很别扭。

我已经在我的应用程序中使用了 CQRS 和 EventSourcing 中的某些概念,但是为域服务中的数据发生的所有事情抛出一个事件似乎是一种矫枉过正(尤其是当数据处于不存在的状态时)在进行进一步的转换之前,不会由域服务返回。)

【问题讨论】:

  • 失败是技术性的,还是您与您的企业谈论的失败?

标签: c# logging domain-driven-design onion-architecture


【解决方案1】:

这里有一些选项。

  1. 使用装饰器。您说您已经在使用 CQRS,因此将装饰器添加到您要记录的命令/查询中。缺点是您只能在命令/查询执行之前和之后记录,而不能在执行期间记录。而且我不确定以这种方式记录您的事件是否也很容易。

  2. 使用您的界面。如果您选择此路径,那么您的ILogger 接口确实应该在域层中,因为域将需要一个实现您的记录器要求的组件,因此域层是定义此接口的那个。它的实现必须在其他地方,而且在基础设施层对我来说听起来不错。

【讨论】:

  • 这两点都是解决方案,但如果我必须选择,我可能会选择第一个。大多数(如果不是全部)业务领域都不关心日志记录。
【解决方案2】:

[...] 我的域服务无法访问它

为什么不呢? ILogger 应该住在基础设施层,但谁说领域层无法访问基础设施成员?

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

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

我不知道您是否已经在使用控制反转,因为这是加载此类基础架构代码实现的最佳方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-17
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多