假设我的架构与Layered Architecture Sample类似。我们还假设每个大盒子都是它自己的项目。框架框和每个图层将是它自己的项目。如果我们不使用IoC而是使用没有接口的传统分层方法,那么Service将引用将引用Data的Business,并且所有这些引用Frameworks。
现在要求对数据库进行日志记录,因此可能需要Frameworks引用Service来访问数据。这有两个问题:
我知道我在回答我自己的问题,但我基本上想要了解这个架构在没有IoC的情况下是否可行。
答案 0 :(得分:1)
对于此示例,我将调用业务层中需要进行日志记录的日志记录方法。调用一个级别真的没有任何意义。那将是一种不必要的抽象,听起来你已经收集了很多。
服务层中是否提供了从业务层登录时需要的日志记录?如果是这样,也许可以为业务层日志记录创建某种外观。但是,如果您不需要这种抽象,我会直接调用Business日志记录方法。
答案 1 :(得分:1)
如果没有一些控制反转,你就无法做到。
假设您的语言支持.NET中的Reflection,您可以尝试动态调用代码并在运行时反转控件。您不需要接口,但可能需要标记/修饰或具有上层所需类型的约定。
我现在只想到疯狂的,非实用的方法:你可以对二进制文件进行后处理,并在每一层中注入日志记录代码。
答案 2 :(得分:1)
IMO,由于日志记录是跨领域的问题,因此不应该引用您的数据层。在您的问题中,我看到您假设您正在登录数据库。即使这是您的要求,您也必须将日志记录代码的数据库连接/插入与应用程序数据层分开。它将成为Logging库的一部分,而不是Data层的一部分。不要将其视为数据层的一部分。正是这种观点,您可以继续开发/增强日志记录[框架],并且它将与您的数据层分开。
从我的角度来看,数据层只是Application Data Access的组成部分,而不是日志记录。具体来说,您可以看到NLog或Log4Net库,看看他们如何不关心应用程序的数据访问层策略。
希望这有帮助。