【发布时间】:2016-06-17 14:09:08
【问题描述】:
我最近一直在阅读 Mark Seemann 关于依赖注入的书,它提出了一些关于控制反转的架构问题。 假设我有以下内容:
- 一个非常基本的可执行项目,用作组合根,称为 CompositionRoot.exe。
- 编译为库的域项目,称为 Domain.dll
- 编译为库的数据访问项目,称为 DAL.dll
- 编译为库的日志记录项目,称为 Logging.dll
按照 Seeman 书中的 IoC 模式,存储库接口在 Domain 中定义。 DAL 引用域并实现这些接口。 CompositionRoot 负责实例化这些存储库并将它们注入到域中。到目前为止,如此平静。
现在是问题;日志记录如何适应这种情况?
我曾设想过域和 DAL 都使用日志库。一些关于 StackOverflow 的阅读表明,一些开发人员认为日志记录只属于域。有时登录 DAL 对我很有用,例如在对特定 SQL 片段进行基准测试时,或者在不将实体框架特定异常暴露给域的情况下记录实体框架异常。
假设我想同时登录域和 DAL(除非有人能说服我否则)。日志接口是否应该在类似于存储库接口的域中定义?如果是这样,这会将 DAL 的日志记录绑定到域日志记录,这感觉是错误的。或者,DAL 可以定义自己的日志接口,Logging 也实现了该接口。然而,这导致 Logging 必须为每个需要记录的新 DLL 实现一个新接口,这也让人感觉不对。或者,Domain 和 DAL 是否应该参考 Logging(似乎违反 IoC)?还有其他方法吗?我还没有读完 Seemann 的书,但有几点他提到了使用接口库,即只包含接口的 DLL。我目前无法想象这是如何工作的。
【问题讨论】:
标签: logging dependency-injection inversion-of-control