C#在构造函数参数中记录“俄罗斯玩偶效应”

时间:2014-11-03 13:57:15

标签: c# logging reflection aop

首先,我不确定是否用好话来描述我的问题,道歉(英语不是我的母亲)。

关于将 loggers 添加到项目中。 有人问,应该有几个记录器,它们应该“动态”定义。 因此,我们最终得到具有Logger属性的类。

所有构造函数都有一个额外的参数,即使用其他业务参数传递给构造函数的logger实例。当我们深入到代码中时,彼此内部的类使用相同的模式来传递logger实例。

确实有效,但我对它并不满意。 让我烦恼的是记录器不属于业务逻辑。 也许与此无关。

-

更准确地说,这就是我目前正在研究的内容:

  • ILogger接口定义记录器功能(例如LogError(string msg))。不同的记录器将实现此接口。
  • 所有需要进行日志记录的类都将实现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),而无需在代码中明确地将其写入。 如果有可能......

1 个答案:

答案 0 :(得分:1)

您是否听说过依赖注入设计模式?您的原始解决方案是简单的构造函数注入您的最终解决方案是Property injection,您的所有bussines对象都需要具有LoggerPte属性。请查看一些解决方案如何处理依赖注入并通过依赖注入容器构建/创建业务对象(容器将为您注入LoggerPte属性,您不需要在每个对象构造函数中调用静态方法)。我正在使用Unity Container(Microsoft解决方案),但您可以找到很多其他人。

我希望这就是你所需要的。