记录横切关注点需要访问数据层

时间:2014-11-14 01:20:37

标签: language-agnostic circular-dependency n-tier-architecture

假设我的架构与Layered Architecture Sample类似。我们还假设每个大盒子都是它自己的项目。框架框和每个图层将是它自己的项目。如果我们不使用IoC而是使用没有接口的传统分层方法,那么Service将引用将引用Data的Business,并且所有这些引用Frameworks。

现在要求对数据库进行日志记录,因此可能需要Frameworks引用Service来访问数据。这有两个问题:

  1. 你现在有一个循环依赖(记住,没有接口)。如果您使用IoC(依赖注入或服务定位器)和组合根的接口,大部分都可以解决。这是唯一的方法还是你可以在没有界面的情况下以某种方式做到这一点?
  2. 如果您处于Business状态且需要记录某些内容,则必须重新启动服务。有没有办法只从Presentation中跳转而不是从没有组合根的服务/业务/数据跳转?
  3. 我知道我在回答我自己的问题,但我基本上想要了解这个架构在没有IoC的情况下是否可行。

3 个答案:

答案 0 :(得分:1)

对于此示例,我将调用业务层中需要进行日志记录的日志记录方法。调用一个级别真的没有任何意义。那将是一种不必要的抽象,听起来你已经收集了很多。

服务层中是否提供了从业务层登录时需要的日志记录?如果是这样,也许可以为业务层日志记录创建某种外观。但是,如果您不需要这种抽象,我会直接调用Business日志记录方法。

答案 1 :(得分:1)

如果没有一些控制反转,你就无法做到。

假设您的语言支持.NET中的Reflection,您可以尝试动态调用代码并在运行时反转控件。您不需要接口,但可能需要标记/修饰或具有上层所需类型的约定。

我现在只想到疯狂的,非实用的方法:你可以对二进制文件进行后处理,并在每一层中注入日志记录代码。

答案 2 :(得分:1)

IMO,由于日志记录是跨领域的问题,因此不应该引用您的数据层。在您的问题中,我看到您假设您正在登录数据库。即使这是您的要求,您也必须将日志记录代码的数据库连接/插入与应用程序数据层分开。它将成为Logging库的一部分,而不是Data层的一部分。不要将其视为数据层的一部分。正是这种观点,您可以继续开发/增强日志记录[框架],并且它将与您的数据层分开。

从我的角度来看,数据层只是Application Data Access的组成部分,而不是日志记录。具体来说,您可以看到NLog或Log4Net库,看看他们如何不关心应用程序的数据访问层策略。

希望这有帮助。