示例#1
0
        internal Subscription(ISubscriptionKey <T> subRequestKey, IProvideHandlerDispatchDelegateCaches handlerDispatchDelegateCacheProvider)
        {
            OwnerPropId = subRequestKey.OwnerPropId;

            SubscriptionKind          = subRequestKey.SubscriptionKind;
            SubscriptionPriorityGroup = subRequestKey.SubscriptionPriorityGroup;
            //SubscriptionTargetKind = sKey.SubscriptionTargetKind;

            switch (subRequestKey.SubscriptionKind)
            {
            case SubscriptionKind.TypedHandler:
            {
                Target_Wrk = subRequestKey.Target_Wrk;         //new WeakRefKey(subRequestKey.Target);

                Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind));
                HandlerProxy = proxyDelegate;

                Type targetType = subRequestKey.Target.GetType();

                TypePair tp = new TypePair(targetType, typeof(T));

                CallPcTypedEventSubscriberDelegate callTheListenerDel =
                    handlerDispatchDelegateCacheProvider.CallPcTypedEventSubsCache.GetOrAdd(tp);

                PcTypedHandlerDispatcher = callTheListenerDel;

                MethodName = HandlerProxy.Method.Name;
                break;
            }

            //case SubscriptionKind.GenHandler:
            //    break;
            //case SubscriptionKind.ObjHandler:
            //    break;
            //case SubscriptionKind.StandardHandler:
            //    break;

            //case SubscriptionKind.TypedAction:
            //    {
            //        throw new NotImplementedException("Comming soon.");
            //    }

            //case SubscriptionKind.ObjectAction:
            //    break;
            //case SubscriptionKind.ActionNoParams:
            //    break;
            //case SubscriptionKind.LocalBinding:
            //    break;

            default:
                throw new InvalidOperationException($"The SubscriptionKind: {SubscriptionKind} is not recognized or is not supported.");
            }
        }
示例#2
0
        public SubscriptionGen(ISubscriptionKeyGen subRequestKey, IProvideHandlerDispatchDelegateCaches handlerDispatchDelegateCacheProvider)
        {
            if (subRequestKey.HasBeenUsed)
            {
                throw new InvalidOperationException("The Key has already been used.");
            }

            OwnerPropId  = subRequestKey.OwnerPropId;
            PropertyType = subRequestKey.PropertyType;

            SubscriptionKind          = subRequestKey.SubscriptionKind;
            SubscriptionPriorityGroup = subRequestKey.SubscriptionPriorityGroup;
            //SubscriptionTargetKind = sKey.SubscriptionTargetKind;

            switch (SubscriptionKind)
            {
            case SubscriptionKind.TypedHandler:
            {
                Target_Wrk = subRequestKey.Target_Wrk;         // new WeakRefKey(subRequestKey.Target);

                Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind));
                HandlerProxy = proxyDelegate;

                Type targetType = subRequestKey.Target.GetType();

                TypePair tp = new TypePair(targetType, PropertyType);

                CallPcTypedEventSubscriberDelegate callTheListenerDel =
                    handlerDispatchDelegateCacheProvider.CallPcTypedEventSubsCache.GetOrAdd(tp);

                PcTypedHandlerDispatcher = callTheListenerDel;

                MethodName = HandlerProxy.Method.Name;
                break;
            }

            case SubscriptionKind.GenHandler:
            {
                Target_Wrk = subRequestKey.Target_Wrk;         // new WeakRefKey(subRequestKey.Target);

                Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind));
                HandlerProxy = proxyDelegate;

                //Type targetType = sKey.GenHandler.Target.GetType();
                Type targetType = subRequestKey.Target.GetType();

                PcGenHandlerDispatcher = handlerDispatchDelegateCacheProvider.CallPcGenEventSubsCache.GetOrAdd(targetType);

                MethodName = HandlerProxy.Method.Name;
                break;
            }

            case SubscriptionKind.ObjHandler:
            {
                Target_Wrk = subRequestKey.Target_Wrk;         // new WeakRefKey(subRequestKey.Target);

                Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind));
                HandlerProxy = proxyDelegate;

                //Type targetType = sKey.ObjHandler.Target.GetType();
                Type targetType = subRequestKey.Target.GetType();

                PcObjHandlerDispatcher = handlerDispatchDelegateCacheProvider.CallPcObjEventSubsCache.GetOrAdd(targetType);

                MethodName = HandlerProxy.Method.Name;
                break;
            }

            case SubscriptionKind.StandardHandler:
            {
                Target_Wrk = subRequestKey.Target_Wrk;         // new WeakRefKey(subRequestKey.Target);

                Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind));
                HandlerProxy = proxyDelegate;

                //Type targetType = sKey.StandardHandler.Target.GetType();
                Type targetType = subRequestKey.Target.GetType();

                PcStandardHandlerDispatcher = handlerDispatchDelegateCacheProvider.CallPcStEventSubsCache.GetOrAdd(targetType);

                MethodName = HandlerProxy.Method.Name;
                break;
            }

            case SubscriptionKind.ChangingHandler:
            {
                Target_Wrk = subRequestKey.Target_Wrk;         // new WeakRefKey(subRequestKey.Target);

                Delegate proxyDelegate = handlerDispatchDelegateCacheProvider.DelegateProxyCache.GetOrAdd(new MethodSubscriptionKind(subRequestKey.Method, subRequestKey.SubscriptionKind));
                HandlerProxy = proxyDelegate;

                //Type targetType = sKey.ChangingHandler.Target.GetType();
                Type targetType = subRequestKey.Target.GetType();

                PChangingHandlerDispatcher = handlerDispatchDelegateCacheProvider.CallPChangingEventSubsCache.GetOrAdd(targetType);

                MethodName = HandlerProxy.Method.Name;
                break;
            }

            //case SubscriptionKind.TypedAction:
            //    break;
            //case SubscriptionKind.ObjectAction:
            //    break;
            //case SubscriptionKind.ActionNoParams:
            //    break;
            //case SubscriptionKind.LocalBinding:
            //    break;
            default:
                throw new InvalidOperationException($"The SubscriptionKind: {SubscriptionKind} is not recognized or is not supported.");
            }

            //GenDoWhenChanged = sKey.GenDoWhenChanged;
            //Action = sKey.Action;
        }