我有一个要求,即只创建了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
的内部,但我需要确保只有一个实例存在。
答案 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();
}
}