Esempio n. 1
0
        /// <summary>
        /// 注册订阅器。
        /// </summary>
        /// <param name="serviceProvider">应用程序服务实例。</param>
        /// <param name="subscribeMgr">指定订阅管理器。</param>
        /// <param name="types">可被注册为订阅器的类型集合。</param>
        /// <param name="activator">创建订阅器实例的方法,一般是从 <paramref name="serviceProvider"/> 里获取。</param>
        internal static void RegisterSubscribers(IServiceProvider serviceProvider, ISubscribeManager subscribeMgr, IEnumerable <Type> types, Func <IServiceProvider, Type, object> activator)
        {
            foreach (var type in types)
            {
                Type subType = null;
                if ((subType = type.GetInterfaces().FirstOrDefault(s => s.IsGenericType && s.GetGenericTypeDefinition() == typeof(ISubscriber <>))) != null)
                {
                    subType = subType.GetGenericArguments()[0];
                    subscribeMgr.AddSubscriber(subType, new Action <object>(o =>
                    {
                        var method = type.GetMethod(nameof(ISubscriber <string> .Accept));
                        if (method != null)
                        {
                            using var scope = serviceProvider.TryCreateScope();
                            var instance    = activator(scope?.ServiceProvider ?? serviceProvider, type);
                            if (instance != null)
                            {
                                method.FastInvoke(instance, new[] { o });
                            }

                            instance.TryDispose();
                        }
                    }));
                }
                else if (type.IsImplementInterface(typeof(ISubscribeHandler)))
                {
                    foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.Instance))
                    {
                        if (method.DeclaringType != type)
                        {
                            continue;
                        }

                        var parameters = method.GetParameters();
                        if (parameters.Length != 1)
                        {
                            continue;
                        }

                        subscribeMgr.AddSubscriber(parameters[0].ParameterType, new Action <object>(o =>
                        {
                            using var scope = serviceProvider.TryCreateScope();
                            var instance    = activator(scope?.ServiceProvider ?? serviceProvider, type);
                            if (instance != null)
                            {
                                method.FastInvoke(instance, new[] { o });

                                instance.TryDispose();
                            }
                        }));
                    }
                }
            }
        }
Esempio n. 2
0
        public override void Initialize(WebSocketAcceptContext acceptContext)
        {
            base.Initialize(acceptContext);

            _aliveKey = acceptContext.Option.AliveKey;

            //开启消息订阅,使用aliveKey作为通道
            _subscribeMgr = acceptContext.ServiceProvider.TryGetService <ISubscribeManager>();
            _cacheMgr     = acceptContext.ServiceProvider.TryGetService <IDistributedCacheManager>();

            if (_cacheMgr == null)
            {
                throw new NotSupportedException("必须使用分布式缓存组件。");
            }

            _subscribeMgr.AddSubscriber <DistributedInvokeMessage>(_aliveKey, msg =>
            {
                try
                {
                    //收到消息后,在本地查找连接,并发送消息
                    Clients(msg.Connections.ToArray()).SendAsync(msg.Message.Method, msg.Message.Arguments);
                }
                catch { }
            });
        }
Esempio n. 3
0
        /// <summary>
        /// 添加一个订阅者实例。
        /// </summary>
        /// <typeparam name="TSubject"></typeparam>
        /// <param name="subscribeMgr"><see cref="ISubscribeManager"/> 实例。</param>
        /// <param name="subscriber">主题订阅者。</param>
        /// <returns></returns>
        public static ISubscribeManager AddSubscriber <TSubject>(this ISubscribeManager subscribeMgr, ISubscriber <TSubject> subscriber) where TSubject : class
        {
            Guard.ArgumentNull(subscribeMgr, nameof(subscribeMgr));
            Guard.ArgumentNull(subscriber, nameof(subscriber));

            subscribeMgr.AddSubscriber <TSubject>(subject => subscriber.Accept(subject));
            return(subscribeMgr);
        }
Esempio n. 4
0
        /// <summary>
        /// 在指定的程序集中发现 <see cref="ISubscriber&lt;TSubject&gt;"/> 的实现。
        /// </summary>
        /// <typeparam name="TSubject"></typeparam>
        /// <param name="subscribeMgr"><see cref="ISubscribeManager"/> 实例。</param>
        /// <param name="assembly">指定的程序集。</param>
        /// <returns></returns>
        public static ISubscribeManager Discovery <TSubject>(this ISubscribeManager subscribeMgr, Assembly assembly) where TSubject : class
        {
            Guard.ArgumentNull(subscribeMgr, nameof(subscribeMgr));
            Guard.ArgumentNull(assembly, nameof(assembly));

            foreach (var type in assembly.GetExportedTypes().Where(s => !s.IsInterface && !s.IsAbstract && s.IsImplementInterface(typeof(ISubscriber <TSubject>))))
            {
                subscribeMgr.AddSubscriber <TSubject>(subject => type.New <ISubscriber <TSubject> >().Accept(subject));
            }

            return(subscribeMgr);
        }
 /// <summary>
 /// 添加一个读取实体持久化消息的方法。
 /// </summary>
 /// <param name="subscriber"></param>
 public void AddSubscriber(Action <PersistentSubject> subscriber)
 {
     subMgr.AddSubscriber(subscriber);
 }