域层中的日志记录界面

时间:2014-06-23 06:53:11

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

我的域层内部有一些非常昂贵的业务逻辑,必须跟踪数据,以便了解出现故障时发生的情况。因此,我想声明一个简单的日志记录界面:

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

现在我的问题是 - 这个界面属于哪里?当然,日志记录可能是一个基础架构问题(以及一点点跨层关注),但如果我将它放在基础架构层中,我的域服务就无法访问它。如果我将它放入域层,我会介绍登录到我的域的概念,这感觉很尴尬。

我已经使用了CQRS&amp ;;的某些概念。我的应用程序中的EventSourcing,然而就像域服务中的数据一样发生事件似乎是一种过度杀伤(特别是如果数据落入域服务不会返回的状态,直到进一步转换为止已被制作。)

2 个答案:

答案 0 :(得分:1)

这里有一些选择。

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

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

答案 1 :(得分:1)

  

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

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

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

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

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