コード例 #1
0
            public void BindToServiceType()
            {
                #region OnClientConnect Method
                OnClientConnectMethod = ServiceType.GetRuntimeMethods().FirstOrDefault(m => m.GetCustomAttribute(typeof(RPCOnClientConnectAttribute)) != null);
                if (OnClientConnectMethod != null)
                {
                    Core.Log.LibDebug("Binding OnClientConnectMethod in the service {0}", Descriptor.Name);
                }
                #endregion

                #region Events
                if (Descriptor?.Events?.Any() != true)
                {
                    return;
                }

                foreach (var evDesc in Descriptor.Events.Values)
                {
                    if (evDesc.Event == null)
                    {
                        continue;
                    }

                    var eventAttribute = (RPCEventAttribute)ServiceInstance?.GetType().GetRuntimeEvent(evDesc.Name)?.GetCustomAttribute(typeof(RPCEventAttribute)) ??
                                         new RPCEventAttribute(RPCMessageScope.Session);
                    var evHandler = new EventHandler((s, e) =>
                    {
                        if (_server.Transport == null)
                        {
                            return;
                        }
                        Guid clientId;
                        lock (_threadClientId) _threadClientId.TryGetValue(Environment.CurrentManagedThreadId, out clientId);
                        _server.Transport.FireEvent(eventAttribute, clientId, Descriptor.Name, evDesc.Event.Name, s, e);
                    });
                    evDesc.Event.AddEventHandler(ServiceInstance, evHandler);
                    ServiceEventHandlers[evDesc.Event] = evHandler;
                    Core.Log.LibDebug("Binding Event: {0} on service {1}", evDesc.Name, Descriptor.Name);
                }
                #endregion
            }