示例#1
0
 public WhenBuilding()
 {
     _sut = AssemblySourceFilterBuilder.New();
     _mockAssemblySourceProvider = new Mock <IAssemblyFilterSourceProvider>();
     _mockAssembly = new Mock <Assembly>();
     _mockAssemblySourceProvider.Setup(g => g.GetSourceAssemblies()).Returns(new Assembly[] { _mockAssembly.Object });
 }
示例#2
0
        /// <summary>
        /// Adds chatter cqrs capabilities
        /// </summary>
        /// <param name="services">The <see cref="IServiceCollection"/> used to register services used for cqrs capabilities</param>
        /// <param name="configuration">The <see cref="IConfiguration"/> used for configuration based settings</param>
        /// <param name="pipelineBuilder">An optional builder used to define an <see cref="ICommandBehaviorPipeline{TMessage}"/></param>
        /// <param name="messageHandlerSourceBuilder">An optional builder used to define a <see cref="AssemblySourceFilter"/>. Assemblies will be used to find <see cref="IMessageHandler{TMessage}"/> for registration.</param>
        /// <returns>An <see cref="IChatterBuilder"/> used to configure Chatter capabilities</returns>
        public static IChatterBuilder AddChatterCqrs(this IServiceCollection services, IConfiguration configuration, Action <CommandPipelineBuilder> pipelineBuilder = null, Action <AssemblySourceFilterBuilder> messageHandlerSourceBuilder = null)
        {
            var filterBuilder = AssemblySourceFilterBuilder.New();

            messageHandlerSourceBuilder?.Invoke(filterBuilder);
            var filter         = filterBuilder.Build();
            var chatterBuilder = ChatterBuilder.Create(services, configuration, filter);

            var assemblies = filter.Apply();

            chatterBuilder.Services.AddMessageHandlers(assemblies);
            chatterBuilder.Services.AddQueryHandlers(assemblies);

            chatterBuilder.Services.AddScoped <IMessageDispatcherProvider, MessageDispatcherProvider>();

            chatterBuilder.Services.AddInMemoryMessageDispatchers();
            chatterBuilder.Services.AddInMemoryQueryDispatcher();

            chatterBuilder.Services.AddIfNotRegistered <IExternalDispatcher, NoOpExternalDispatcher>(ServiceLifetime.Scoped);

            return(AddCommandPipeline(chatterBuilder, pipelineBuilder));
        }
示例#3
0
        /// <summary>
        /// Adds and configured Chatter message broker related capabilities
        /// </summary>
        /// <param name="builder">A <see cref="IChatterBuilder"/> used for registration and setup</param>
        /// <param name="receiverHandlerSourceBuilder">An optional builder used to define an <see cref="AssemblySourceFilter"/>. Assemblies will be used to find <see cref="IBrokeredMessageReceiver{TMessage}"/> for registration. Will override any assemblies located via <see cref="AssemblySourceFilter"/> created during Chatter cqrs configuration.</param>
        /// <param name="optionsBuilder">A delegate that uses a <see cref="MessageBrokerOptionsBuilder"/> to construct <see cref="MessageBrokerOptions"/></param>
        /// <returns>An <see cref="IChatterBuilder"/> used to configure Chatter capabilities</returns>
        public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, Action <MessageBrokerOptionsBuilder> optionsBuilder = null, Action <AssemblySourceFilterBuilder> receiverHandlerSourceBuilder = null)
        {
            var filter = builder.AssemblySourceFilter;

            if (receiverHandlerSourceBuilder != null)
            {
                var filterBuilder = AssemblySourceFilterBuilder.New();
                receiverHandlerSourceBuilder(filterBuilder);
                filter = filterBuilder.Build();
            }
            var assemblies = filter.Apply();

            var messageBrokerOptionsBuilder = builder.Services.AddMessageBrokerOptions(builder.Configuration);

            optionsBuilder?.Invoke(messageBrokerOptionsBuilder);
            MessageBrokerOptions options = messageBrokerOptionsBuilder.Build();

            builder.Services.AddSingleton <IMessagingInfrastructureProvider, MessagingInfrastructureProvider>();

            builder.Services.Replace <IExternalDispatcher, BrokeredMessageDispatcher>(ServiceLifetime.Scoped);
            builder.Services.AddScoped <IBrokeredMessageReceiverFactory, BrokeredMessageReceiverFactory>();
            builder.Services.AddScoped <IBrokeredMessageDispatcher, BrokeredMessageDispatcher>();
            builder.Services.AddIfNotRegistered <IBrokeredMessagePathBuilder, DefaultBrokeredMessagePathBuilder>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <IBrokeredMessageAttributeDetailProvider, BrokeredMessageAttributeProvider>(ServiceLifetime.Scoped);

            builder.Services.AddIfNotRegistered <ICircuitBreaker, CircuitBreaker>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <ICircuitBreakerStateStore, InMemoryCircuitBreakerStateStore>(ServiceLifetime.Scoped);

            builder.Services.AddIfNotRegistered <IMaxReceivesExceededAction, ErrorQueueDispatcher>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <IRetryDelayStrategy, NoDelayRetry>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <ICriticalFailureNotifier, CriticalFailureEventDispatcher>(ServiceLifetime.Scoped);

            builder.Services.AddIfNotRegistered <IMessageIdGenerator, GuidIdGenerator>(ServiceLifetime.Scoped);

            builder.Services.AddScoped <IForwardMessages, ForwardingRouter>();
            builder.Services.AddScoped <IReplyRouter, ReplyRouter>();

            builder.Services.AddScoped <IOutboxProcessor, OutboxProcessor>();
            builder.Services.AddIfNotRegistered <IBrokeredMessageOutbox, InMemoryBrokeredMessageOutbox>(ServiceLifetime.Scoped);
            builder.Services.AddIfNotRegistered <IBrokeredMessageInbox, InMemoryBrokeredMessageInbox>(ServiceLifetime.Scoped);
            builder.Services.AddSingleton <IRetryExceptionPredicatesProvider, DefaultExceptionsPredicateProvider>();
            builder.Services.AddSingleton <IRetryExceptionEvaluator, RetryExceptionEvaluator>();
            builder.Services.AddSingleton <ICircuitBreakerExceptionEvaluator, CircuitBreakerExceptionEvaluator>();
            builder.Services.AddSingleton <ICircuitBreakerExceptionPredicatesProvider, DefaultExceptionsPredicateProvider>();
            builder.Services.AddScoped <IRetryStrategy, RetryStrategy>();
            builder.Services.AddScoped <IRecoveryStrategy, RetryWithCircuitBreakerStrategy>();
            builder.Services.AddScoped <IReceivedMessageDispatcher, ScopedReceivedMessageDispatcher>();

            if (options?.Reliability?.EnableOutboxPollingProcessor ?? false)
            {
                builder.Services.AddHostedService <BrokeredMessageOutboxProcessor>();
            }

            if (options?.Reliability?.RouteMessagesToOutbox ?? false)
            {
                builder.Services.AddIfNotRegistered <IRouteBrokeredMessages, OutboxBrokeredMessageRouter>(ServiceLifetime.Scoped);
            }
            else
            {
                builder.Services.AddIfNotRegistered <IRouteBrokeredMessages, BrokeredMessageRouter>(ServiceLifetime.Scoped);
            }

            builder.AddAllReceivers(assemblies);

            builder.Services.AddScoped <IBodyConverterFactory, BodyConverterFactory>();
            builder.Services.AddScoped <IBrokeredMessageBodyConverter, TextPlainBodyConverter>();
            builder.Services.AddScoped <IBrokeredMessageBodyConverter, JsonBodyConverter>();

            return(builder);
        }
 public void MustThrowIfNullAssemblySourceProvider()
 => FluentActions.Invoking(() => AssemblySourceFilterBuilder.WithAssemblySourceProvider(null)).Should().ThrowExactly <ArgumentNullException>();
        public void MustSetAssemblySourceProvider()
        {
            var filter = AssemblySourceFilterBuilder.WithAssemblySourceProvider(_mockAssemblySourceProvider.Object).Build();

            Assert.Equal(_mockAssemblySourceProvider.Object, filter.AssemblySourceProvider);
        }
        public void MustReturnBuilder()
        {
            var retVal = AssemblySourceFilterBuilder.WithAssemblySourceProvider(_mockAssemblySourceProvider.Object);

            Assert.IsType <AssemblySourceFilterBuilder>(retVal);
        }