public WhenBuilding() { _sut = AssemblySourceFilterBuilder.New(); _mockAssemblySourceProvider = new Mock <IAssemblyFilterSourceProvider>(); _mockAssembly = new Mock <Assembly>(); _mockAssemblySourceProvider.Setup(g => g.GetSourceAssemblies()).Returns(new Assembly[] { _mockAssembly.Object }); }
/// <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)); }
/// <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); }