【发布时间】:2014-04-15 01:04:36
【问题描述】:
我有一个静态类,用于访问静态并发字典:
public static class LinkProvider
{
private static ConcurrentDictionary<String, APNLink.Link> deviceLinks;
static LinkProvider()
{
int numProcs = Environment.ProcessorCount;
int concurrencyLevel = numProcs * 2;
deviceLinks = new ConcurrentDictionary<string, APNLink.Link>(concurrencyLevel, 64);
}
public APNLink.Link getDeviceLink(string deviceId, string userId)
{
var result = deviceLinks.First(x => x.Key == deviceId).Value;
if (result == null)
{
var link = new APNLink.Link(username, accountCode, new APNLink.DeviceType());
deviceLinks.TryAdd(deviceId, link);
return link;
}
else
{
return result;
}
}
public bool RemoveLink(string deviceId)
{
//not implmented
return false;
}
}
如何在asp.net的控制器中使用这个类
即我想去:
LinkProvider provider;
APNLink.Link tmpLink = provider.getDeviceLink(id, User.Identity.Name);
//use my link
背景。该字典用于保存asp.net web api程序中状态/请求之间的链接对象。因此,当服务需要使用链接时,它会要求链接提供者为它找到一个链接,如果没有,它必须创建一个。所以我需要字典对象到我所有的 http 请求中的同一个实例。
【问题讨论】:
-
如果你在做一个静态类,一切都应该是静态的。如果初始化,有一个私有的
bool来标记,并在getDeviceLink的开头处理它。 -
那么在我的场景中我真的需要一个静态类吗?我可以不只是让字典静态吗?
-
如果字典是静态的,您是否需要 和
LinkProvider的实例来处理字典?可能是。取决于它对 非静态 数据所做的其他事情。但如果不是,静态类可能是完全合适的。 -
换句话说,如果字典是静态的,并且所有方法都只适用于该字典并且不需要需要任何其他数据,那么静态类可能是最合适。
标签: c# static initialization static-class