【发布时间】:2014-08-07 10:24:34
【问题描述】:
我目前有 6 或 7 个单例的集合,所有这些都做几乎相同的事情(参见下面示例中的 For 方法)但使用不同的内部数据库查询并返回不同对象的集合(所以在每个单例中解析数据库结果是不同的)。
因此,使用this question 作为我的基础,我一直在尝试在 C# 中为这些单例构建一个抽象的通用基类。
SO 上有 similar questions,但没有一个实现 Lazy,我希望这样做。
到目前为止我有这个
public abstract class SingletonBase<T> where T : class, new()
{
private static Lazy<SingletonBase<T>> _lazy;
private static readonly object _lock = new object();
public static SingletonBase<T> Instance
{
get
{
if (_lazy != null && _lazy.IsValueCreated)
{
return _lazy.Value;
}
lock (_lock)
{
if (_lazy != null && _lazy.IsValueCreated)
{
return _lazy.Value;
}
***** this is the problem line *****
_lazy = new Lazy<SingletonBase<T>>(new T());
}
return _lazy.Value;
}
}
public abstract IEnumerable<T> For(string systemLangCode);
}
但是,上线出现问题
_lazy = new Lazy<SingletonBase<T>>(new T());
Visual Studio 告诉我“无法解析构造函数 'Lazy
我不确定应该将什么传递给Lazy<SingletonBase<T>> 的构造函数,还是我走错了方向?
【问题讨论】:
-
为什么还要使用泛型?这是有原因的吗?
-
这里展示了一些做单例的标准技术:csharpindepth.com/Articles/General/Singleton.aspx
-
@T_D:这是一个有效的问题,我没有真正的答案,除了当我四处寻找其他单例基类时,其他示例使用泛型。
-
@dbc:我已经读过那篇文章——不止一次——但它没有涵盖将它用作可派生的基类。
-
@awj:“它不包括将其用作可派生的基类” - 请告诉我们,您将派生和覆盖哪些与单例相关的函数?
标签: c# generics singleton abstract-base-class