我将在运行时使用反射将一些类加载到我的程序中。我希望这些类能够使用与主程序相同的日志记录类。
想一想,我将如何处理这个问题?使用静态类会起作用吗?
我宁愿不使用日志框架,因为它对于我想要的东西来说太过分了。
谢谢。
如果您真的不想使用日志框架(这可以理解),那么您可能需要查看 Singleton 模式。
using System;
public class Singleton
{
private static Singleton instance;
private Singleton() {}
public static Singleton Instance
{
get
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
请注意如何只能从其.Instance
属性创建/访问/访问此类,这些属性都共享相同的实例。
你可以用一个名为 ILogger 的通用接口来包装你的记录器实现——你将加载的所有类都将在它们的构造函数中接受该接口——并且你可以在创建它们时将你的记录器实现注入它们。另外——关于运行时的加载——你听说过 MEF 吗? http://msdn.microsoft.com/en-us/library/dd460648.aspx - 在这方面它可能对你有帮助,并且会自动将记录器依赖注入到你加载的新类中
我认为类引用的单例记录器不好,因为它将记录器从您的代码库紧密耦合到您创建的类。构造函数中的注入和接口将使它们与记录器松散耦合,并使它们更加独立和可测试。
如果您想使用单例,请注意在 C# 中它可以以不那么冗长的方式实现:
public class Singletone
{
public static readonly Singletone Instance = new Singletone();
private Singletone() {}
// other methods
public void DoTheJob(){}
}
// usage
Singletone.Instance.DoTheJob();
此实现解决了诸如延迟初始化(字段初始化器仅在应用程序域中第一次使用类时执行)以及线程安全(静态初始化器在 .NET 中保证是线程安全的)等问题。
看看log4net。这将处理你想要的所有事情。如果您需要在某个特殊的地方记录,请实现您自己的附加程序来执行此操作。其他日志框架将提供您需要的功能。无需重新发明日志记录。