【问题标题】:C# logging "russian dolls effect" in constructors parametersC# 在构造函数参数中记录“俄罗斯娃娃效果”
【发布时间】: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


【解决方案1】:

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

我希望这是你需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多