【问题标题】:Singleton constructor question单例构造函数问题
【发布时间】:2010-05-03 14:58:47
【问题描述】:

我在 c# 中创建了一个 Singleton 类,其中包含一个我想在第一次调用 Singleton 时初始化的公共属性。

这是我写的代码:

public class BL
{
    private ISessionFactory _sessionFactory;
    public ISessionFactory SessionFactory
    {
        get { return _sessionFactory; }
        set { _sessionFactory = value; }
    }

    private BL()
    {
        SessionFactory = Dal.SessionFactory.CreateSessionFactory();
    }

    private object thisLock = new object();

    private BL _instance = null;
    public BL Instance
    {
        get
        {
            lock (thisLock)
            {
                if (_instance == null)
                {
                    _instance = new BL();
                }
                return _instance;
            }
        }
    }
}

据我所知,当我第一次在 BL 类中寻址 Instance BL 对象时,它应该加载构造函数并初始化 SessionFactory 对象。

但是当我尝试时: BL.Instance.SessionFactory.OpenSession(); 我得到一个空引用异常,我看到 SessionFactory 是空的...

为什么?

【问题讨论】:

  • BL.Instance 甚至不应该编译,因为Instance 不是static 属性...我认为Instance_instancethisLock 都应该是static
  • 是 Dal.SessionFactory.CreateSessionFactory();返回null?
  • 您使用的是什么版本的 C# / .NET?

标签: c# singleton


【解决方案1】:

这不是单例。您应该参考 Jon Skeet 在singletons in C# 上的出色指南。例如,使用这种模式:

public sealed class Singleton
{
    static readonly Singleton instance=new Singleton();

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}

特别注意该实例是静态的。

【讨论】:

  • 好的,然后我应该把我拥有的 ISessionFactory 对象的初始化放在哪里 (Dal.SessionFactory.CreateSessionFactory();) ??
  • @gillyb:看起来它应该是类的只读实例成员,在构造函数中初始化。不过,您可能想先阅读以下内容:stackoverflow.com/questions/185384/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多