【发布时间】:2014-11-04 00:02:05
【问题描述】:
首先,我不确定我用好词来描述我的问题,道歉(英语不是我的妈妈)。
这是关于将 loggers 添加到项目中。
有人问,应该有几个记录器,并且应该“动态地”定义它们。
所以我们最终得到了具有Logger 属性的类。
所有构造函数都有一个额外的参数,即logger 实例与其他业务参数一起传递给构造函数。随着我们深入代码,彼此内部的类使用相同的模式来传递logger 实例。
当然可以,但我对此并不满意。 让我烦恼的是记录器不属于业务逻辑。 也许与它无关。
--
更准确地说,这是我目前正在研究的:
- 有定义记录器功能的
ILogger接口(例如LogError(string msg))。不同的 Logger 会实现这个接口。 -
ILoggable接口将由所有需要进行日志记录的类实现。这个接口有一个属性public ILogger LoggerPte
我使用一个静态类 LoggerUtility 和一个 [ThreadStatic] 字段 static ILogger CurrentLogger 和一个函数:
public static void SetLoggerReference(ILoggable loggableClass)
{
loggableClass.LoggerPte = CurrentLogger;
}
在 loggable 类之外,定义了 CurrentLogger。
在 loggable 类的构造函数中,我必须调用LoggerUtility.SetLoggerReference(this);
如果发现这种方式更优雅虽然可能会被扭曲,但我想知道是否可以更进一步......
我刚刚开始阅读有关自定义属性、反射和 AOP 的内容。有人可以帮我介绍一下如何使用像[Loggable] 这样的属性来自动使构造函数在构造函数之后调用函数SetLoggerReference(this),而无需在代码中显式编写它。
如果可以的话……
【问题讨论】:
-
看看 PostSharp。他们使用 Aop 有一个很好的解决方案
-
This 文章描述了一种用于构建支持 AOP 的解决方案的灵活设计。
-
PostSharp 将是可以使用的东西,但这取决于我团队的决定。我正在寻找的东西在“裸”C#中是不可能的,这是一个答案。所以我想我会从 qujck 的文章中得到启发。感谢您的回答。
标签: c# logging reflection aop