我的域层内部有一些非常昂贵的业务逻辑,必须跟踪数据,以便了解出现故障时发生的情况。因此,我想声明一个简单的日志记录界面:
public interface ILogger {
void Log(LogEntry entry);
}
现在我的问题是 - 这个界面属于哪里?当然,日志记录可能是一个基础架构问题(以及一点点跨层关注),但如果我将它放在基础架构层中,我的域服务就无法访问它。如果我将它放入域层,我会介绍登录到我的域的概念,这感觉很尴尬。
我已经使用了CQRS&amp ;;的某些概念。我的应用程序中的EventSourcing,然而就像域服务中的数据一样发生事件似乎是一种过度杀伤(特别是如果数据落入域服务不会返回的状态,直到进一步转换为止已被制作。)
答案 0 :(得分:1)
这里有一些选择。
使用装饰器。您说您已经在使用CQRS,因此请在要记录的命令/查询中添加装饰器。缺点是您只能在执行命令/查询之前和之后记录,而不能在执行期间记录。而且我不确定以这种方式记录您的活动是否容易。
使用您的界面。如果选择此路径,则实际上ILogger
接口应位于域层中,因为域将需要一个实现记录器要求的组件,因此域层是定义此接口的层。它的实现必须在其他地方,在基础设施层对我来说听起来不错。
答案 1 :(得分:1)
[...]我的域名服务无法访问
为什么不呢? ILogger
应该存在于基础设施层,但是谁说域层无法访问基础架构成员?
据我所知,基础架构是一个无关的非域特定代码,它解决了I / O,网络,数据库访问等常见问题。 日志记录是一个基础架构问题。
基础架构代码应实现或提供跨层软件,并且可能提供基于基础架构的ILogger
实现。如果您的域名需要某种特定的日志记录代码,那么您将在域层中提供SomeDomainLogger
。
我不知道您是否已经在使用控制反转,因为这是加载此类基础架构代码实现的最佳方式。