3

我有一个程序集,其目的是基本日志记录。

我有其他引用此程序集的程序集。

有没有办法在引用程序集中共享对象实例?那么,对于一个日志记录活动,只使用一个日志记录类的实例?

例如,如果 Logger 程序集/命名空间中的方法被调用AddInfo()。当程序集 A 有一个类需要记录它使用的信息时loggerInstance1.AddInfo()……而当程序集 B 需要做同样的事情时……它重用相同的loggerInstance1.AddInfo()……而不是loggerInstance2.AddInfo()

4

5 回答 5

6

...现在是完全不同的东西。

另一个完全不同的策略是引用 system.web(是的,你甚至可以在桌面应用程序中引用这个程序集):

using System.Web;

然后将您想要“全局共享”的任何类放入缓存中:

HttpRuntime.Cache.Insert("Logger", LoggingObject, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration);

最后,要获取全局对象的实例,只需从缓存中拉取它:

object LoggingObject = HttpRuntime.Cache.Get("Logger");

巴姆。即时全局可访问的一次性对象,无需单例模式。

当然,您也可以稍微更改逻辑以尝试获取 Logger,如果它不存在,则第一次创建它并将其放入缓存中以备将来使用。这仅取决于您是否知道访问顺序。

于 2010-12-24T06:41:24.797 回答
3

仅在一个程序集中使日志记录类成为单例,并且只要正确编写了单例并且您通过公共.GetInstance()方法创建了它的实例,您将只创建一个实例。

像这样的东西:

class Singleton
{
    private static Singleton instance;
    private static int usageCount;

    private Singleton()
    {
        usageCount= 0;
    }
    public static Singleton GetInstance()
    {
        if (instance == null)
        {
            instance = new Singleton();
        }
        usageCount++;
        return instance;
    }
    public static int UsageCount
    {
        get { return usageCount; }
    }
}

我只是好奇:为什么另一个程序集创建自己的日志记录类实例这么重要?那确实会是更好的 OO,并且可能更易于维护,特别是如果没有具体的理由来阻止这种行为(而且我想不出在日志记录类中这样做的充分理由)。

于 2010-12-24T05:23:46.693 回答
2

如果您的项目允许,您可以使用任何 IoC 容器,并将您的类注册为 IoC 中的 Singleton Scope,而不是使用容器通过程序集获取单个实例。

但是这个解决方案需要在.net中使用像Unity这样的DI

于 2010-12-24T06:27:43.133 回答
0

这两个程序集是否在同一个应用程序域或同一个进程中运行?如果您对两个程序集都有完全的编译控制,我会采用 FlipScript 的想法并创建一个单例类,这样所有的日志记录都是通过同一个对象完成的。

您可以尝试的另一个选项是使用第三方日志库。我用这个电话log4net

它使用起来非常简单,并且日志记录是高度可配置的。

于 2010-12-24T06:57:41.057 回答
0

我有一半同意 Flip。

在这种特定情况下,您确实想要实现单例模式:

http://www.dofactory.com/Patterns/PatternSingleton.aspx#_self1

这是一个完全有效的 OO 设计模式,但是它可能不是这个问题的最可测试的解决方案。由于它是静态的,因此在对依赖于记录器的类进行单元测试时可能会更难以抽象。

另一种解决方案是使用控制容器的反转(例如用于 java 的 Spring,或用于 MS.NET 的 Spring.NET)。使用这种方法,依赖于记录器的对象只需公开您的记录器类型的属性。IoC 容器识别类型,以及如何创建一个,并将为您连接依赖项。作为向 IoC 容器注册记录器的一部分,您可以告诉容器将记录器视为单例,因此相同的实例将被永久丢弃。

这个解决方案显然更复杂,对于像记录单例模式这样的事情可能更适合你。

事实上,我强烈建议在谷歌上搜索一些 3rd 方库以进行日志记录。如果您使用的是 MS.NET,我发现 log4net 非常棒。

于 2010-12-24T05:42:41.243 回答