所以我有这个数据访问层,我也想登录数据库。本着吃自己的狗粮的精神,我想用我的数据访问层来做日志记录。但是,我还想记录数据访问本身。像这样:
App
||
V
Log
||
V
Data=>Log
我是否有进入反馈循环的风险?如果是这样,我该如何避免呢?项目的引用是否会相互循环并导致构建困难?你过去如何成功地接触过这种(反?)模式?
答案 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();
}
}