您好,
我有一个看起来像这样的服务:
[ServiceBehavior(Name = "MyAppClientService", Namespace = "http://MyApp.ServiceContracts/2007/11", InstanceContextMode = InstanceContextMode.PerSession)]
public class MyAppClientService : IMyAppClientService
[ServiceContract(Namespace = "http://MyApp.ServiceContracts/2007/11", Name = "IMyAppClientService", SessionMode = SessionMode.Required, CallbackContract = typeof(IMyAppClientServiceCallback))]
public interface IMyAppClientService
在服务上我得到了像这样的singelton类>
public class SharedContext
{
protected Dictionary<Guid, UserContextOnService> _userContextDictionary = new Dictionary<Guid, UserContextOnService>();
public static SharedContext Instance
{
get
{
if (_instance == null)
_instance = new SharedContext();
return _instance;
}
}
}
首先我用client1登录,我可以看到userContextDictionary只包含一个(正确)。然后我用client2登录(当client1正在运行时),然后我可以看到userContextDictionary的计数为2?
这是如何工作的?该服务设置为PerCall?这是否意味着每个会话都有自己的服务实例?
我正在寻找一个singelton服务解决方案,但我好奇这是如何工作的?如果服务在不同的实例中运行,那么它应该不能共享数据吗?
BestRegards
答案 0 :(得分:1)
您的SharedContext
单例非常差,因为它还没有为多线程环境做好准备。检查this article它是否描述了如何正确使用它。
你究竟要求什么?你有一个访问单身的服务,拿着一些字典 - 服务的实例化模式并不重要。您仍然拥有整个应用程序域的单个字典,因为singleton只对您的所有服务实例都有一个。
如果您希望同时访问字典中的共享数据(看起来像您想要的那样),您还应该在那里处理一些同步或使用ConcurrentDictionary
代替。