0

我将在运行时使用反射将一些类加载到我的程序中。我希望这些类能够使用与主程序相同的日志记录类。

想一想,我将如何处理这个问题?使用静态类会起作用吗?

我宁愿不使用日志框架,因为它对于我想要的东西来说太过分了。

谢谢。

4

4 回答 4

2

如果您真的不想使用日志框架(这可以理解),那么您可能需要查看 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属性创建/访问/访问此类,这些属性都共享相同的实例。

于 2013-01-29T08:43:34.653 回答
0

你可以用一个名为 ILogger 的通用接口来包装你的记录器实现——你将加载的所有类都将在它们的构造函数中接受该接口——并且你可以在创建它们时将你的记录器实现注入它们。另外——关于运行时的加载——你听说过 MEF 吗? http://msdn.microsoft.com/en-us/library/dd460648.aspx - 在这方面它可能对你有帮助,并且会自动将记录器依赖注入到你加载的新类中

我认为类引用的单例记录器不好,因为它将记录器从您的代码库紧密耦合到您创建的类。构造函数中的注入和接口将使它们与记录器松散耦合,并使它们更加独立和可测试。

于 2013-01-29T09:23:08.920 回答
0

如果您想使用单例,请注意在 C# 中它可以以不那么冗长的方式实现:

public class Singletone
{
   public static readonly Singletone Instance = new Singletone();

   private Singletone() {}
   // other methods 
   public void DoTheJob(){}
}

// usage
Singletone.Instance.DoTheJob();

此实现解决了诸如延迟初始化(字段初始化器仅在应用程序域中第一次使用类时执行)以及线程安全(静态初始化器在 .NET 中保证是线程安全的)等问题。

于 2013-01-29T08:48:41.223 回答
0

看看log4net。这将处理你想要的所有事情。如果您需要在某个特殊的地方记录,请实现您自己的附加程序来执行此操作。其他日志框架将提供您需要的功能。无需重新发明日志记录。

log4net

于 2013-01-29T08:40:10.487 回答