6

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

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

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

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

4

2 回答 2

3

这里有一些选项。

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

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

于 2014-06-23T07:02:21.723 回答
1

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

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

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

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

我不知道您是否已经在使用inversion of control,因为这是加载此类基础设施代码实现的最佳方式。

于 2014-06-23T07:39:42.410 回答