public static IChatterBuilder AddSqlServiceBroker(this IChatterBuilder builder, Action <SqlServiceBrokerOptionsBuilder> optionsBuilder = null) { var optBuilder = builder.Services.AddSqlServiceBrokerOptions(); optionsBuilder?.Invoke(optBuilder); var options = optBuilder.Build(); builder.Services.AddIfNotRegistered <SqlServiceBrokerReceiver>(ServiceLifetime.Scoped); builder.Services.AddIfNotRegistered <SqlServiceBrokerSenderFactory>(ServiceLifetime.Singleton); builder.Services.AddIfNotRegistered <SqlServiceBrokerSender>(ServiceLifetime.Scoped); builder.Services.AddIfNotRegistered <SqlServiceBrokerReceiverFactory>(ServiceLifetime.Singleton); builder.Services.AddSingleton <ICircuitBreakerExceptionPredicatesProvider, SqlCircuitBreakerExceptionPredicatesProvider>(); builder.Services.AddSingleton <IRetryExceptionPredicatesProvider, SqlRetryExceptionPredicatesProvider>(); builder.Services.AddSingleton <IMessagingInfrastructure>(sp => { var sender = sp.GetRequiredService <SqlServiceBrokerSenderFactory>(); var receiver = sp.GetRequiredService <SqlServiceBrokerReceiverFactory>(); return(new MessagingInfrastructure(SSBMessageContext.InfrastructureType, receiver, sender)); }); builder.Services.AddScoped <IBrokeredMessageBodyConverter, JsonUnicodeBodyConverter>(); builder.Services.AddSingleton(options); return(builder); }
/// <summary> /// Configures a change feed for specified table /// </summary> /// <typeparam name="TRowChangedData">The <see cref="IMessage"/> representing the state of a changed row in the table being watched</typeparam> /// <param name="connectionString">The connection string for the sql server with the database and table to watch for changes</param> /// <param name="databaseName">Optional. The database containing the table to watch. If not specified, Database or InitialCatalog of the connectionString will be used.</param> /// <param name="tableName">The name of the table to watch</param> /// <param name="optionsBuilder">An optional builder allowing more complex change feed configuration</param> /// <returns><see cref="IChatterBuilder"/></returns> public static IChatterBuilder AddSqlChangeFeed <TRowChangedData>(this IChatterBuilder builder, string connectionString, string databaseName, string tableName, Action <SqlChangeFeedOptionsBuilder> optionsBuilder = null) where TRowChangedData : class, IMessage, new() { var changeFeedOptions = builder.Services.AddSqlChangeFeedOptionsBuilder(connectionString, tableName, databaseName); optionsBuilder?.Invoke(changeFeedOptions); SqlChangeFeedOptions options = changeFeedOptions.Build(); builder.Services.AddIfNotRegistered <ISqlDependencyManager <TRowChangedData> >(ServiceLifetime.Scoped, sp => { return(new SqlDependencyManager <TRowChangedData>(options)); }); builder.AddSqlServiceBroker(ssbBuilder => { var receiver = string.IsNullOrWhiteSpace(options.ChangeFeedQueueName) ? $"{ChatterServiceBrokerConstants.ChatterQueuePrefix}{typeof(TRowChangedData).Name}" : options.ChangeFeedQueueName; var dlq = string.IsNullOrWhiteSpace(options.ChangeFeedDeadLetterServiceName) ? $"{ChatterServiceBrokerConstants.ChatterDeadLetterServicePrefix}{typeof(TRowChangedData).Name}" : options.ChangeFeedDeadLetterServiceName; ssbBuilder.AddSqlServiceBrokerOptions(options.ServiceBrokerOptions) .AddQueueReceiver <ProcessChangeFeedCommand <TRowChangedData> >(receiver, errorQueuePath: options.ReceiverOptions.ErrorQueuePath, transactionMode: options.ReceiverOptions.TransactionMode, deadLetterServicePath: dlq); }); if (options.ProcessChangeFeedCommandViaChatter) { builder.Services.Replace <IBrokeredMessageReceiver <ProcessChangeFeedCommand <TRowChangedData> >, ChangeFeedReceiver <ProcessChangeFeedCommand <TRowChangedData>, TRowChangedData> >(ServiceLifetime.Scoped); } return(builder); }
public WhenGettingProperties() { _serviceCollection = new Mock <IServiceCollection>(); _configuration = new Mock <IConfiguration>(); _assemblySourceFilterMock = new Mock <IAssemblySourceFilter>(); _sut = ChatterBuilder.Create(_serviceCollection.Object, _configuration.Object, _assemblySourceFilterMock.Object); }
/// <summary> /// Adds Azure Service Bus as messaging infrastructure for Chatter.MessageBrokers. <see cref="ServiceBusOptions"/> configured via configuration. /// </summary> /// <param name="builder"></param> /// <param name="configSectionName"></param> /// <returns></returns> public static IChatterBuilder AddAzureServiceBus(this IChatterBuilder builder, Action <ServiceBusOptionsBuilder> optionsBuilder = null) { var optBuilder = ServiceBusOptionsBuilder.Create(builder.Services, builder.Configuration); optionsBuilder?.Invoke(optBuilder); var options = optBuilder.Build(); return(AddAzureServiceBus(builder, options)); }
/// <summary> /// Scans all assemblies for classes decorated with <see cref="BrokeredMessageAttribute"/> and have a non-null <see cref="BrokeredMessageAttribute.ReceiverName"/>. Registers: /// </summary> /// <param name="builder">The singleton <see cref="ChatterBuilder"/> instance used for registration.</param> /// <returns>The singleton <see cref="IChatterBuilder"/> instance.</returns> private static IChatterBuilder AddAllReceivers(this IChatterBuilder builder, IEnumerable <Assembly> assemblies) { var messages = FindBrokeredMessagesWithReceiversInAssembliesByType(assemblies); foreach (var receiverType in GetAllReceiverTypes(messages)) { builder.Services.AddReceiverImpl(receiverType.Item2, receiverType.Item1); } return(builder); }
public static IChatterBuilder AddSagas(this IChatterBuilder builder) { builder.Services.AddScoped <IDispatchMessages, SagaMessageDispatcher>(); builder.Services.AddSingleton <ISagaPersister, InMemorySagaPersister>(); builder.Services.AddScoped <ISagaOrchestrator, SagaOrchestrator>(); builder.Services.AddScoped <ISagaInitializer, SagaInitializer>(); builder.Services.AddScoped <ISagaOptionsProvider, SagaOptionsProvider>(); return(builder); }
/// <summary> /// Scans all assemblies for classes decorated with <see cref="BrokeredMessageAttribute"/> and have a non-null <see cref="BrokeredMessageAttribute.ReceiverName"/>. Registers: /// </summary> /// <param name="builder">The singleton <see cref="ChatterBuilder"/> instance used for registration.</param> /// <returns>The singleton <see cref="IChatterBuilder"/> instance.</returns> private static IChatterBuilder AddReceivers(this IChatterBuilder builder, IEnumerable <Assembly> assemblies) { var messages = FindBrokeredMessagesWithReceiversInAssembliesByType(assemblies); foreach (var receiverType in GetAllReceiverTypes(messages)) { builder.Services.AddScoped(receiverType.Item1, receiverType.Item2); builder.Services.AddSingleton(typeof(IHostedService), sp => { using var scope = sp.CreateScope(); return(scope.ServiceProvider.GetRequiredService(receiverType.Item1)); }); } return(builder); }
internal static IChatterBuilder AddCommandPipeline(this IChatterBuilder chatterBuilder, Action <CommandPipelineBuilder> pipelineBuilder) { var pipeline = chatterBuilder.Services.CreatePipelineBuilder(); if (pipeline is null) { return(chatterBuilder); } chatterBuilder.Services.AddTransient(typeof(ICommandBehaviorPipeline <>), typeof(CommandBehaviorPipeline <>)); pipelineBuilder?.Invoke(pipeline); return(chatterBuilder); }
private static IChatterBuilder AddAzureServiceBus(IChatterBuilder builder) { builder.Services.AddScoped <IBrokeredMessageDetailProvider, BrokeredMessageAttributeProvider>(); builder.Services.AddSingleton <IBrokeredMessageInfrastructureDispatcher, ServiceBusMessageSender>(); builder.Services.AddSingleton <BrokeredMessageSenderPool>(); builder.Services.Scan(s => s.FromAssemblies(AppDomain.CurrentDomain.GetAssemblies()) .AddClasses(c => c.AssignableTo(typeof(IMessagingInfrastructureReceiver <>))) .UsingRegistrationStrategy(RegistrationStrategy.Skip) .AsImplementedInterfaces() .WithScopedLifetime()); return(builder); }
/// <summary> /// Configures a change feed for specified table /// </summary> /// <param name="rowChangedDataType">A type implementing <see cref="IMessage"/> that maps to a row that changed in the target database</param> /// <param name="connectionString">The connection string for the sql server with the database and table to watch for changes</param> /// <param name="databaseName">Optional. The database containing the table to watch. If not specified, Database or InitialCatalog of the connectionString will be used.</param> /// <param name="tableName">The name of the table to watch</param> /// <param name="optionsBuilder">An optional builder allowing more complex change feed configuration</param> public static IChatterBuilder AddSqlChangeFeed(this IChatterBuilder builder, Type rowChangedDataType, string connectionString, string databaseName, string tableName, Action <SqlChangeFeedOptionsBuilder> optionsBuilder = null) { typeof(SqlChangeFeedExtensions).GetMethods() .Where(m => m.IsGenericMethod && m.Name == nameof(AddSqlChangeFeed)) .FirstOrDefault() .MakeGenericMethod(rowChangedDataType) .Invoke(null, new object[] { builder, connectionString, databaseName, tableName, optionsBuilder }); return(builder); }
public static IChatterBuilder AddCommandPipeline(this IChatterBuilder chatterBuilder, Action <PipelineBuilder> pipelineBulder) { var pipeline = chatterBuilder.Services.CreatePipelineBuiler(); if (pipeline is null) { return(chatterBuilder); } chatterBuilder.Services.Scan(s => s.FromApplicationDependencies() //TODO: do we need to use marker types? .AddClasses(c => c.AssignableTo(typeof(ICommandBehaviorPipeline <>))) .UsingRegistrationStrategy(RegistrationStrategy.Throw) .AsImplementedInterfaces() .WithTransientLifetime()); pipelineBulder?.Invoke(pipeline); return(chatterBuilder); }
/// <summary> /// Initializes a <see cref="ChatterBuilder"/> and registers all dependencies. /// Registers all <see cref="BrokeredMessageReceiver{TMessage}"/> and automatically starts receiving if configured to do so. /// Registers all routers. /// </summary> /// <param name="builder">A <see cref="IChatterBuilder"/> used registration and setup</param> /// <param name="assemblies">The assemblies that are required for registering receivers</param> /// <returns>An instance of <see cref="IChatterBuilder"/>.</returns> public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, IEnumerable <Assembly> assemblies, Action <MessageBrokerOptionsBuilder> optionsBuilder = null) { var messageBrokerOptionsBuilder = builder.Services.AddMessageBrokerOptions(); optionsBuilder?.Invoke(messageBrokerOptionsBuilder); MessageBrokerOptions options = messageBrokerOptionsBuilder.Build(); builder.Services.AddScoped <IBrokeredMessageDispatcher, BrokeredMessageDispatcher>(); builder.Services.AddScoped <IForwardMessages, ForwardingRouter>(); builder.Services.AddScoped <IRouteCompensationMessages, CompensateRouter>(); builder.Services.AddScoped <IReplyRouter, ReplyRouter>(); builder.Services.AddScoped <IOutboxProcessor, OutboxProcessor>(); builder.Services.AddIfNotRegistered <IBrokeredMessageOutbox, InMemoryBrokeredMessageOutbox>(ServiceLifetime.Scoped); builder.Services.AddIfNotRegistered <IBrokeredMessageInbox, InMemoryBrokeredMessageInbox>(ServiceLifetime.Scoped); if (options?.Reliability?.RouteMessagesToOutbox ?? false) { builder.Services.AddScoped <IRouteBrokeredMessages, OutboxBrokeredMessageRouter>(); if (options?.Reliability?.EnableOutboxPollingProcessor ?? false) { builder.Services.AddHostedService <BrokeredMessageOutboxProcessor>(); } } else { builder.Services.AddScoped <IRouteBrokeredMessages, BrokeredMessageRouter>(); } builder.Services.Decorate <IMessageDispatcher, RoutingSlipMessageDispatcherDecorator>(); //TODO: we'll only want to add this if routing slips are added builder.AddReceivers(assemblies); builder.Services.AddScoped <IBodyConverterFactory, BodyConverterFactory>(); builder.Services.AddScoped <IBrokeredMessageBodyConverter, JsonBodyConverter>(); return(builder); }
private static IChatterBuilder AddAzureServiceBus(this IChatterBuilder builder, ServiceBusOptions options) { builder.Services.AddScoped <ServiceBusReceiver>(); builder.Services.AddSingleton <ServiceBusReceiverFactory>(); builder.Services.AddScoped <ServiceBusMessageSender>(); builder.Services.AddSingleton <ServiceBusMessageSenderFactory>(); builder.Services.AddSingleton <BrokeredMessageSenderPool>(); builder.Services.AddSingleton <AzureServiceBusEntityPathBuilder>(); builder.Services.AddSingleton <ICircuitBreakerExceptionPredicatesProvider, ServiceBusCircuitBreakerExceptionPredicatesProvider>(); builder.Services.AddSingleton <IRetryExceptionPredicatesProvider, ServiceBusRetryExceptionPredicatesProvider>(); builder.Services.AddSingleton <IMessagingInfrastructure>(sp => { var sender = sp.GetRequiredService <ServiceBusMessageSenderFactory>(); var receiver = sp.GetRequiredService <ServiceBusReceiverFactory>(); var pathBuilder = sp.GetRequiredService <AzureServiceBusEntityPathBuilder>(); return(new MessagingInfrastructure(ASBMessageContext.InfrastructureType, receiver, sender, pathBuilder)); }); return(builder); }
/// <summary> /// Adds registrations required for Azure Service Bus integration with Chatter.CQRS, including <see cref="ServiceBusOptions"/>, queue, topic and subscription factories and publishers. /// </summary> /// <param name="builder">The singleton <see cref="ChatterBuilder"/> instance used for registration.</param> /// <param name="configSectionName">The configuration section name containing Azure Service Bus configuration values used to build a <see cref="ServiceBusOptions"/> instance. 'ServiceBus' is the default value.</param> /// <returns>The singleton <see cref="IChatterBuilder"/> instance.</returns> public static IChatterBuilder AddAzureServiceBus(this IChatterBuilder builder, Action <ServiceBusOptionsBuilder> optionsBuilder) { optionsBuilder(builder.Services.AddAzureServiceBus()); return(AddAzureServiceBus(builder)); }
/// <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="messageBrokerOptionsBuilder">A delegate that uses a <see cref="MessageBrokerOptionsBuilder"/> to construct <see cref="MessageBrokerOptions"/></param> /// <param name="markerTypesForRequiredAssemblies">Marker types whose parent 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> /// <returns>An <see cref="IChatterBuilder"/> used to configure Chatter capabilities</returns> public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, Action <MessageBrokerOptionsBuilder> messageBrokerOptionsBuilder = null, params Type[] markerTypesForRequiredAssemblies) => AddMessageBrokers(builder, messageBrokerOptionsBuilder, b => b.WithMarkerTypes(markerTypesForRequiredAssemblies));
/// <summary> /// Initializes a <see cref="ChatterBuilder"/> and registers all dependencies. /// Registers all <see cref="BrokeredMessageReceiver{TMessage}"/> and automatically starts receiving if configured to do so. /// Registers all routers. /// </summary> /// <param name="builder">A <see cref="IChatterBuilder"/> used registration and setup</param> /// <param name="markerTypesForRequiredAssemblies">The <see cref="Type"/>s from assemblies that are required for registering receivers</param> /// <returns>An instance of <see cref="IChatterBuilder"/>.</returns> public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, params Type[] markerTypesForRequiredAssemblies) { return(AddMessageBrokers(builder, null, markerTypesForRequiredAssemblies)); }
/// <summary> /// Initializes a <see cref="ChatterBuilder"/> and registers all dependencies. /// Registers all <see cref="BrokeredMessageReceiver{TMessage}"/> and automatically starts receiving if configured to do so. /// Registers all routers. /// </summary> /// <param name="builder">A <see cref="IChatterBuilder"/> used registration and setup</param> /// <param name="markerTypesForRequiredAssemblies">The <see cref="Type"/>s from assemblies that are required for registering receivers</param> /// <param name="messageBrokerOptionsBuilder">A delegate that uses a <see cref="MessageBrokerOptionsBuilder"/> to construct <see cref="MessageBrokerOptions"/></param> /// <returns>An instance of <see cref="IChatterBuilder"/>.</returns> public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, Action <MessageBrokerOptionsBuilder> messageBrokerOptionsBuilder = null, params Type[] markerTypesForRequiredAssemblies) { var assemblies = markerTypesForRequiredAssemblies.GetAssembliesFromMarkerTypes(); return(AddMessageBrokers(builder, assemblies, messageBrokerOptionsBuilder)); }
/// <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="messageBrokerOptionsBuilder">A delegate that uses a <see cref="MessageBrokerOptionsBuilder"/> to construct <see cref="MessageBrokerOptions"/></param> /// <param name="receiverAssemblies">Assemblies that 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> /// <returns>An <see cref="IChatterBuilder"/> used to configure Chatter capabilities</returns> public static IChatterBuilder AddMessageBrokers(this IChatterBuilder builder, Action <MessageBrokerOptionsBuilder> messageBrokerOptionsBuilder = null, params Assembly[] receiverAssemblies) => AddMessageBrokers(builder, messageBrokerOptionsBuilder, b => b.WithExplicitAssemblies(receiverAssemblies));
/// <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="receiverNamespaceSelector">A namespace selector used to find assemblies containing types with matching namespaces or assemblies with matching FullName. Supports '*' and '?' wildcard values. Matching assemblies 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="messageBrokerOptionsBuilder">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, string receiverNamespaceSelector, Action <MessageBrokerOptionsBuilder> messageBrokerOptionsBuilder = null) => AddMessageBrokers(builder, messageBrokerOptionsBuilder, b => b.WithNamespaceSelector(receiverNamespaceSelector));
/// <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 static IChatterBuilder AddCommandPipeline(this IChatterBuilder chatterBuilder, Action <CommandPipelineBuilder> pipelineBulder) => CqrsExtensions.AddCommandPipeline(chatterBuilder, pipelineBulder);