private object getServerInstance(serverImplementer server, RequestMsg request, out Guid?checkedOutID, out bool lockTaken) { object result = null; checkedOutID = null; lockTaken = false; if (server.InstanceMode == ServerInstanceMode.Singleton) { if (!m_SingletonInstances.TryGetValue(server.Implementation, out result)) { lock (m_SingletonInstancesLock) { if (!m_SingletonInstances.TryGetValue(server.Implementation, out result)) { result = createInstance(server); var dict = new Dictionary <Type, object>(m_SingletonInstances); dict[server.Implementation] = result; m_SingletonInstances = dict;//atomic } } } } else if (server.InstanceMode == ServerInstanceMode.Stateful || server.InstanceMode == ServerInstanceMode.AutoConstructedStateful) { if (request.RemoteInstance.HasValue) { result = App.ObjectStore.CheckOut(request.RemoteInstance.Value); if (result == null || result.GetType() != server.Implementation) { throw new StatefulServerInstanceDoesNotExistException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_DOES_NOT_EXIST_ERROR + server.Implementation.FullName); } checkedOutID = request.RemoteInstance.Value; if (!server.ThreadSafe) { if (!Monitor.TryEnter(result, this.Glue.ServerInstanceLockTimeoutMs)) { App.ObjectStore.CheckIn(checkedOutID.Value); //check it back in because we could not lock it throw new StatefulServerInstanceLockTimeoutException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_LOCK_TIMEOUT_ERROR + server.Implementation.FullName); } lockTaken = true; } } else { result = createInstance(server); //no need to lock as instance is brand new } } else // ServerInstanceMode.PerCall { result = createInstance(server); } return(result); }
private serverImplementer getServerImplementer(ServerEndPoint sep, Type contract) { serverImplementer server; if (sep.m_ContractImplementers.TryGetValue(contract, out server)) { return(server); } server = new serverImplementer(this, sep, contract); //throws sep.m_ContractImplementers.TryAdd(contract, server); return(server); }
private object createInstance(serverImplementer server) { try { if (server.SupportsGlueCtor) { return(Activator.CreateInstance(server.Implementation, Glue, server.InstanceMode)); } else { return(Activator.CreateInstance(server.Implementation, true)); } } catch (Exception error) { throw new ServerInstanceActivationException(StringConsts.GLUE_SERVER_INSTANCE_ACTIVATION_ERROR + server.Implementation.FullName, error); } }
private object getServerInstance(serverImplementer server, RequestMsg request, out Guid?checkedOutID, out bool lockTaken) { object result = null; checkedOutID = null; lockTaken = false; if (server.InstanceMode == ServerInstanceMode.Singleton) { if (!m_SingletonInstances.TryGetValue(server.Implementation, out result)) //per ServerHandler/Glue instance { lock (m_SingletonInstancesLock) { if (!m_SingletonInstances.TryGetValue(server.Implementation, out result)) { result = createInstance(server); //Inject dependencies into singleton server implementor ONLY ONCE at creation App.DependencyInjector.InjectInto(result); var dict = new Dictionary <Type, object>(m_SingletonInstances); dict[server.Implementation] = result; m_SingletonInstances = dict;//atomic } } } } else if (server.InstanceMode == ServerInstanceMode.Stateful || server.InstanceMode == ServerInstanceMode.AutoConstructedStateful) { if (request.RemoteInstance.HasValue) { result = App.ObjectStore.CheckOut(request.RemoteInstance.Value); if (result == null || result.GetType() != server.Implementation) { throw new StatefulServerInstanceDoesNotExistException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_DOES_NOT_EXIST_ERROR + server.Implementation.FullName); } checkedOutID = request.RemoteInstance.Value; if (!server.ThreadSafe) { if (!Monitor.TryEnter(result, this.Glue.ServerInstanceLockTimeoutMs)) { App.ObjectStore.CheckIn(checkedOutID.Value); //check it back in because we could not lock it throw new StatefulServerInstanceLockTimeoutException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_LOCK_TIMEOUT_ERROR + server.Implementation.FullName); } lockTaken = true; } } else { result = createInstance(server); //no need to lock as instance is brand new } //Inject dependencies into newly created or checked out stateful instance //The DI is thread safe because in the unlikely case of DI injected values change, //DI sets all ref type fields atomically per CLR guarantee App.DependencyInjector.InjectInto(result); } else // ServerInstanceMode.PerCall { result = createInstance(server); //Inject dependencies into newly created per-call instance App.DependencyInjector.InjectInto(result); } //singleton is NOT DI'ed here return(result); }
private object createInstance(serverImplementer server) { try { if (server.SupportsGlueCtor) return Activator.CreateInstance(server.Implementation, Glue, server.InstanceMode); else return Activator.CreateInstance(server.Implementation, true); } catch(Exception error) { throw new ServerInstanceActivationException(StringConsts.GLUE_SERVER_INSTANCE_ACTIVATION_ERROR + server.Implementation.FullName, error); } }
private object getServerInstance(serverImplementer server, RequestMsg request, out Guid? checkedOutID, out bool lockTaken) { object result = null; checkedOutID = null; lockTaken = false; if (server.InstanceMode == ServerInstanceMode.Singleton) { if (!m_SingletonInstances.TryGetValue(server.Implementation, out result)) lock(m_SingletonInstancesLock) { if (!m_SingletonInstances.TryGetValue(server.Implementation, out result)) { result = createInstance(server); var dict = new Dictionary<Type, object>( m_SingletonInstances ); dict[server.Implementation] = result; m_SingletonInstances = dict;//atomic } } } else if (server.InstanceMode == ServerInstanceMode.Stateful || server.InstanceMode == ServerInstanceMode.AutoConstructedStateful) { if (request.RemoteInstance.HasValue) { result = App.ObjectStore.CheckOut(request.RemoteInstance.Value); if (result==null || result.GetType()!=server.Implementation) throw new StatefulServerInstanceDoesNotExistException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_DOES_NOT_EXIST_ERROR + server.Implementation.FullName); checkedOutID = request.RemoteInstance.Value; if (!server.ThreadSafe) { if (!Monitor.TryEnter(result, this.Glue.ServerInstanceLockTimeoutMs)) { App.ObjectStore.CheckIn(checkedOutID.Value);//check it back in because we could not lock it throw new StatefulServerInstanceLockTimeoutException(StringConsts.GLUE_STATEFUL_SERVER_INSTANCE_LOCK_TIMEOUT_ERROR + server.Implementation.FullName); } lockTaken = true; } } else result = createInstance(server);//no need to lock as instance is brand new } else // ServerInstanceMode.PerCall { result = createInstance(server); } return result; }
private serverImplementer getServerImplementer(ServerEndPoint sep, Type contract) { serverImplementer server; if (sep.m_ContractImplementers.TryGetValue(contract, out server)) return server; server = new serverImplementer(this, sep, contract); //throws sep.m_ContractImplementers.TryAdd(contract, server); return server; }