/// <inheritdoc />
        public Guid Subscribe <TMessage>(Func <TMessage, CancellationToken, Task> handler, Action <SubscriptionFactoryOptions <TMessage> > configure)
        {
            var options = new SubscriptionFactoryOptions <TMessage>();

            configure?.Invoke(options);

            return(Subscribe(handler, options));
        }
Ejemplo n.º 2
0
        public static Guid Subscribe <TMessage>([NotNull] this IEventSubscriber bus, Action <TMessage> handler, SubscriptionFactoryOptions <TMessage> options)
        {
            if (bus == null)
            {
                throw new ArgumentNullException(nameof(bus));
            }

            return(bus.Subscribe((message, cancellationToken) =>
            {
                handler?.Invoke(message);
                return Task.CompletedTask;
            },
                                 options));
        }
        /// <inheritdoc />
        public Guid Subscribe <TMessage>(Func <TMessage, CancellationToken, Task> handler, SubscriptionFactoryOptions <TMessage> options)
        {
            var id = options?.Id ?? Guid.NewGuid();

            if (_options.EnableInternalLogging)
            {
                _logger?.LogTrace(message: "Subscribed to {MessageName}, ID: {SubscriptionId}, Options: {@Options}", typeof(TMessage).Name, id, options);
            }

            var runBlindly          = options?.RunBlindly ?? _options.DefaultRunInBackground;
            var includeDerivedTypes = options?.IncludeDerivedTypes ?? _options.DefaultInheritSubscription;

            _subscriptionRequests.Enqueue(new Subscription(id, typeof(TMessage), runBlindly, includeDerivedTypes, HandlerWithCheck));

            async Task HandlerWithCheck(object message, CancellationToken cancellationToken)
            {
                if (message is TMessage msg)
                {
                    var task = handler?.Invoke(msg, cancellationToken);

                    if (task != null)
                    {
                        await task.ConfigureAwait(false);
                    }
                }
            }

            return(id);
        }