单例的通用抽象基类(C#) – 无法实例化私有Lazy实例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了单例的通用抽象基类(C#) – 无法实例化私有Lazy实例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2711字,纯文字阅读大概需要4分钟。
内容图文
![单例的通用抽象基类(C#) – 无法实例化私有Lazy实例](/upload/InfoBanner/zyjiaocheng/771/3ed4187a3f074dbe88c5fd59f66eb2ac.jpg)
我目前有一个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< T>‘.”
我不确定应该将什么传递给Lazy< SingletonBase< T>>的构造函数,还是我走错了方向?
解决方法:
尽管有一些很好的建议,但我仍然想使用单例来提供解决方案,因为我觉得我可以用更简单的代码来实现这一点.这就是我所做的.
这是通用基类.
public abstract class SingletonBase<S, T> where S : class, new()
{
protected static readonly Dictionary<string, List<T>> Dictionary = new Dictionary<string, List<T>>();
private static readonly S _instance = new S();
private static readonly object _lock = new object();
public static S Instance
{
get
{
lock (_lock)
{
return _instance;
}
}
}
public IEnumerable<T> For(string systemLangCode)
{
systemLangCode = systemLangCode.ToLower();
if (!Dictionary.ContainsKey(systemLangCode))
{
PopulateDictionary(systemLangCode);
}
return Dictionary.FirstOrDefault(d => d.Key == systemLangCode).Value;
}
protected abstract void PopulateDictionary(string systemLangCode);
}
我实际上在这里做的是,除了实例化和缓存派生类型的实例S之外,还处理对T的集合的请求,而不是查询数据库,并存储所有可能的记录集,我查询记录集在需要时,使用systemLangCode作为查询中的变量,将此记录集解析为List< T>,然后使用systemLangCode作为键将此集合存储在Dictionary中.
因此,仅在先前未通过该单例获取此结果集时才进行查询.
这是上述基类的推导.
public sealed class Languages : SingletonBase<Languages, Language>
{
protected override void PopulateDictionary(string systemLangCode)
{
var languages = new List<Language>();
// some DB stuff
Dictionary.Add(systemLangCode, languages);
}
}
这个基类现在允许我构建一系列派生类,它们只包含数据库查询.因此,我现在有一个单身人士的单一定义,我可以用它来存储,例如,不同语言的语言集合,不同语言的国家集合,不同语言的时区集合等.
用法示例:
var langsDe = Languages.Instance.For("de");
var langsEn = Languages.Instance.For("en");
如果我以后打电话
var langsDe = Languages.Instance.For("de");
然后,这将从内部词典中检索.
内容总结
以上是互联网集市为您收集整理的单例的通用抽象基类(C#) – 无法实例化私有Lazy实例全部内容,希望文章能够帮你解决单例的通用抽象基类(C#) – 无法实例化私有Lazy实例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。