如何在C#中跨程序集共享对象实例?

时间:2010-12-24 05:13:28

标签: c# instantiation sharing

我有一个目的是基本记录的程序集。

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

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

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

5 个答案:

答案 0 :(得分:4)

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

另一个完全不同的策略是引用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");

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

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

答案 1 :(得分:3)

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

这样的事情:

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,并且可能更容易维护,特别是如果没有具体的理由来阻止这种行为(我不能在日志记录类中想到一个很好的理由)。

答案 2 :(得分:1)

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

但是这个解决方案需要在.net

中使用像Unity这样的DI

答案 3 :(得分:0)

我同意Flip。

听起来你在这个特定情况下想要的是实现Singleton模式:

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

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

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

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

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

答案 4 :(得分:0)

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

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

使用起来非常简单,并且日志记录具有高度可配置性。