就个人而言,仅基于存储当前用户的概念,数据库选项对我来说听起来有点过分。如果您实际上存储的不止这些,那么使用数据库可能是有意义的。但假设您只需要 WCF 服务的两个实例中的当前用户列表,我会使用内存解决方案,类似于静态通用字典。只要可以唯一标识服务,我就会使用唯一的服务 ID 作为字典中的键,并将每个键与该服务的通用用户名列表(或一些适当的用户数据结构)配对。就像是:
private static Dictionary<Guid, List<string>> _currentUsers;
由于此字典将在两个 WCF 服务之间共享,因此您需要同步对它的访问。这是一个例子。
public class MyWCFService : IMyWCFService
{
private static Dictionary<Guid, List<string>> _currentUsers =
new Dictionary<Guid, List<string>>();
private void AddUser(Guid serviceID, string userName)
{
// Synchronize access to the collection via the SyncRoot property.
lock (((ICollection)_currentUsers).SyncRoot)
{
// Check if the service's ID has already been added.
if (!_currentUsers.ContainsKey(serviceID))
{
_currentUsers[serviceID] = new List<string>();
}
// Make sure to only store the user name once for each service.
if (!_currentUsers[serviceID].Contains(userName))
{
_currentUsers[serviceID].Add(userName);
}
}
}
private void RemoveUser(Guid serviceID, string userName)
{
// Synchronize access to the collection via the SyncRoot property.
lock (((ICollection)_currentUsers).SyncRoot)
{
// Check if the service's ID has already been added.
if (_currentUsers.ContainsKey(serviceID))
{
// See if the user name exists.
if (_currentUsers[serviceID].Contains(userName))
{
_currentUsers[serviceID].Remove(userName);
}
}
}
}
}
鉴于您不希望用户为特定服务列出两次,将 替换为 可能是有意义List<string>
的HashSet<string>
。