预计即将推出的.Net项目理念中可能的循环参考情况......需要注意什么?

时间:2009-12-15 17:35:17

标签: .net data-access-layer circular-dependency feedback-loop

所以我有这个数据访问层,我也想登录数据库。本着吃自己的狗粮的精神,我想用我的数据访问层来做日志记录。但是,我还想记录数据访问本身。像这样:

App
||
V
Log
||
V
Data=>Log

我是否有进入反馈循环的风险?如果是这样,我该如何避免呢?项目的引用是否会相互循环并导致构建困难?你过去如何成功地接触过这种(反?)模式?

2 个答案:

答案 0 :(得分:1)

创建仅包含接口的程序集(或大小写的程序集)。从具体类程序集引用仅接口程序集,并使每个具体类实现一个或多个接口。没有具体的类程序集引用作为解决方案一部分的其他具体类程序集。

这种方法可以帮助您避免循环依赖。

实施dependency injection / inversion of control container,例如StructureMap或您可用的许多其他.NET选项之一,以进一步减少耦合。

答案 1 :(得分:1)

可能过于简化的解决方案:

public interface ILoggable {
    string ToLogFormat();
}

然后在任何可以记录的对象上实现此接口。日志记录层现在仅依赖于接口,并且可以在任何级别使用。

另一种方法是使用'helper'类通过重载来实现ToLogFormat,例如

public class LogHelper {
    public string ToLogFormat(DAO obj) { ... }
    public string ToLogFormat(SomeOtherClass obj) { ... }
    ...
}

你可以使用一个单片日志助手(这很糟糕,因为它必须引用每个库)但更好的解决方案可能是为每个程序集或类实现日志助手,并使用log-helper类的名称来指定自定义属性

个人而言,我更喜欢ILoggable方法更灵活;你的日志包可以有一个简单的功能,如:

public class Logger {
    public string ToLogFormat(object obj) {
        if (obj is ILoggable) {
            return ((ILoggable)obj).ToLogFormat();
        }
        return obj.ToString();
    }
}