Exemple #1
0
 public BindInfo(Delegate clientHandler, EventHandlerShim shim, long handlerId)
 {
     ClientHandler        = clientHandler;
     Shim                 = shim;
     HandlerId            = handlerId;
     _eventHandlerInvoker = GetEventHandlerInvoker(ClientHandler.GetType(), ClientHandler.Method.GetParameters());
 }
Exemple #2
0
        void AddEventTarget(Type sourceType, object source, string eventName, Delegate handler, WeakBridgeDuplicateMode?duplicateMode)
        {
            if ((sourceType == null) == (source == null))
            {
                throw new ArgumentException("Exactly one of sourceType and source must be non-null");
            }

            if (eventName == null)
            {
                throw new ArgumentNullException("eventName");
            }

            if (handler == null)
            {
                throw new ArgumentNullException("handler");
            }

            EventHandlerShim shim;

            lock (_bindInfosLock)
            {
                var match = GetBindInfoMatcher(sourceType, source, eventName, handler);

                if ((duplicateMode ?? _defaultDuplicateMode) == WeakBridgeDuplicateMode.CheckAndPrevent &&
                    _bindInfos.Where(x => x != null).Any(match))
                {
                    // already bound
                    return;
                }

                // find unused index
                var handlerIndex = Array.IndexOf(_bindInfos, null);

                if (handlerIndex == -1)
                {
                    // no unused: expand array
                    handlerIndex = _bindInfos.Length;
                    Array.Resize(ref _bindInfos, _bindInfos.Length + _growBindInfosBy);
                }

                // may throw ArgumentException
                var handlerId = _nextBindInfoId++;
                shim = new EventHandlerShim(sourceType, source, eventName, _thisReference, handlerIndex, handlerId,
                                            handler.Method.GetParameters());
                _bindInfos[handlerIndex] = new BindInfo(handler, shim, handlerId);

                // DEADLOCK (uncomment the next line, and comment out the same call just below)
                // shim.RegisterEventHandler();
            }

            // Don't register the event handler in the synchronization context to avoid the possibility of
            // deadlocks triggered by side-effects of binding (e.g. further bind/unbind activity via an
            // add accessor in the event source class)
            shim.RegisterEventHandler();

            if (_unregisterInFinalizer)
            {
                GC.ReRegisterForFinalize(this);
            }
        }
        public async Task HandlingCommandWithNoRegisteredHandlerShouldRunNoMatchingRegistrationHandler()
        {
            var busSettings     = new BusSettings();
            var updater         = new OuterPipelineDetector();
            var dependencyScope = new TestDependencyScope();

            var handler     = new TestEventHandler();
            var handlerShim = new EventHandlerShim <NoMatchingRegistrationEvent, TestEventHandler>(handler);

            dependencyScope.AddObject(handlerShim);

            var busBuilder = new BusBuilder()
                             .RegisterEventHandler <NoMatchingRegistrationEvent, TestEventHandler>();
            var pipelineBuilder    = new PipelineBuilder(busBuilder);
            var pipelineRunBuilder = new PipelineRunBuilder(busSettings, pipelineBuilder, updater, dependencyScope);

            var runner = pipelineRunBuilder.GetRunnerForPipeline(typeof(TestCommand), default(CancellationToken));

            await runner.Handle(new TestCommand());

            handler.CallsToHandle.Should().Be(1);
        }