正确使用单例模式

时间:2014-08-04 14:49:18

标签: c# .net singleton

我有一个要求,即只创建了BillLines的一个实例,这对于单例模式当然是完美的。

Jon's Skeet's post我不太明白我在哪里制作新的'对象(即有用的对象不是一些抽象的Singleton对象)。

这对你来说是否正确?

public sealed class ContextSingleton
{
    private static readonly Lazy<ContextSingleton> Lazy =
        new Lazy<ContextSingleton>(() => new ContextSingleton());

    public static ContextSingleton Instance { get { return Lazy.Value; } }

    private ContextSingleton()
    {
    }

    //Is this correct?  Where should I 'new' this?
    public readonly IBillLineEntities Context = new BillLines.BillLines();
}

像这样访问:

var contextSingleton = ContextSingleton.Instance.Context;

更新

我无法访问BillLines的内部,但我需要确保只有一个实例存在。

3 个答案:

答案 0 :(得分:3)

我认为BillLines应该是您的Instance变量。

它应该是这样的:

public static class ContextSingleton
{
    private static readonly Lazy<BillLines> _instance =
        new Lazy<BillLines>(() => new BillLines());

    public static BillLines Instance { get { return _instance.Value; } }

    private ContextSingleton()
    {
    }
}

你这样使用它:

ContextSingleton.Instance

修改

这个答案的目标是创建一个关于特定类的单例。如果其他人可以访问您的BillLines类并且可以创建自己的实例,那么您应该重新考虑您尝试做的事情。如果您确实控制了BillLines课程的曝光度,那么您应该这样做,以便它只暴露在您所曝光的单身人士的内部实现中,因此没有其他人可以创建new BillLines看得合适。

答案 1 :(得分:0)

像这样简单吗?

public class BillLines
{
    private BillLines()
    {
    }
    private static BillLines _billLines = null;

    public static BillLines Instance
    {
        get
        {
            if (_billLines == null)
                _billLines = new BillLines();
            return _billLines;
        }
    }
}

答案 2 :(得分:0)

感谢@JonSkeet和@RobH的评论我走了依赖注入路线。我选择Ninject,这就像我预期的那样完成工作:

public class NinjectBindings : NinjectModule
{
    public override void Load()
    {
        Bind<IBillLineEntities>.To<BillLines.BillLines>().InSingletonScope();
    }
}