Releases: zarusz/SlimMessageBus
Host.Transport-2.1.3
- [Host.AsyncApi] Remove references to non-existing bindings #174
Host.Transport-2.1.2
Host.Transport-2.1.1
- [Host.AsyncAPI] Allow multiple subscribers on one topic (#169)
Host.Transport-2.1.0
Host.Transport-2.0.0: Releasing v2.0.0
- SMB uses Microsoft.Extensions.DependencyInjection.Abstractions at the core.
1.2. Removed Unity and Autofac plugins.
1.2. Repurpose theSlimMessageBus.Host.AspNetCore
plugin to just configure theMessageBus.Current
static accessor. - Incorporated hybrid transport into the core transport implementation (#161).
- An implementation of
IHostedService
is registered that starts consumers when used with the .NET Generic Host. - Support for requests that do not have a response type associated with it (new types
IRequestHandler<TRequest>
,IRequest
). - The
IRequest<TResponse>
is the new replacement forIRequestMessage<TResponse>
- please migrate. - Streamlined the bus configuration - several improvements to the
services.AddSlimMessageBus(mbb => {})
:
6.1. Theservices.AddSlimMessageBus(mbb => { })
can be used multiple times and the end result will be additive (internally it usesservices.TryAddTransient()
)
6.2. TheMessageBusBuilder
is registered in the MSDI
6.3. Incorporated services registration for MSDI inside.AddSlimMessageBus()
- this helps to put all the bus and plugin setup in one place.
6.4. TheIMessageBusConfigurator
has been removed - adding severalservices.AddSlimMessageBus(mbb => {})
allows achieving modularization.
6.5. Separation of bus configuration (declaring producers, consumers) away from MSDI services registration - this allows registering interceptor plugins in the MSDI from introspecting the actual producers, consumers, and their settings.
6.6. SMB can assume the consumer type ofIConsumer<TMessage>
and hence the.WithConsumer<SomeConsumer>()
can be skipped most of the time.
6.7. The provider configuration uses an action method (#163). - Upgrade the underlying transport client libraries to the latest versions (Redis, Kafka, Azure Service Bus, Azure Event Hub).
- Kafka default header serializer (#157).
- [Host.Outbox] Registers publish/consume interceptors only for the message types for which the producer opted in for outbox, and for consumers that opted in for transaction scope (optimization).
Ad 1.1. & 2.
Uninstall packages:
SlimMessageBus.Host.Autofac
SlimMessageBus.Host.Unity
SlimMessageBus.Host.MsDependencyInjection
SlimMessageBus.Host.FluentValidation.MsDependencyInjection
SlimMessageBus.Host.Hybrid
Ad 3.
The request processing will be awaited during .Send()
, however, no response will be returned. If an exception were to happen on the handler side the exception will be thrown by the .Send()
.
Consider the following example:
// The request has to use the IRequest interface
public class SomeRequest : IRequest
{
}
// The handler has to use IRequestHandler<T> interface
public class SomeRequestHandler : IRequestHandler<SomeRequest>
{
public async Task OnHandle(SomeRequest request)
{
// no response returned
}
}
// The request is declared on the bus builder (for the producer side)
mbb.Produce<SomeRequest>(x =>
{
x.DefaultTopic("topic");
})
// The request handler is declared on the bus builder (for the consumer side)
mbb.Handle<SomeRequest>(x => x
.Topic("topic") // Topic to expect the requests on
//.WithHandler<SomeRequestHandler>()
.KafkaGroup("some-consumer-group") // kafka provider specific
);
// Usage example for the producer side
await bus.Send(new SampleRequest());
Ad 8.
Old way:
services.AddSlimMessageBus((mbb, svp) =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
.WithConsumer<CustomerCreatedEventConsumer>() // Change (1)
.SubscriptionName("sub");
});
mbb.WithSerializer(new JsonMessageSerializer()); // Change (2)
}, addConsumersFromAssembly: new[] { Assembly.GetExecutingAssembly() }); // Change (3)
New way:
services.AddSlimMessageBus(mbb =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
// The line below is now optional (1)
// .WithConsumer<CustomerCreatedEventConsumer>() // Not needed, the IConsumer<CustomerCreatedEvent> will be looked up in DI
.SubscriptionName("sub");
});
mbb.AddServicesFromAssembly(Assembly.GetExecutingAssembly())); // (3)
mbb.AddJsonMessageSerializer(); // requires SlimMessageBus.Host.Serialization.Json package // (2)
});
Also, the .AddServicesFromAssembly()
will register both CustomerCreatedEventConsumer
and IConsumer<CustomerCreatedEvent>
service types in the MSDI.
Ad 6.7.
// before
mbb.WithProviderServiceBus(new ServiceBusMessageBusSettings(serviceBusConnectionString));
// after
mbb.WithProviderServiceBus(cfg =>
{
cfg.ConnectionString = serviceBusConnectionString;
});
// before
mbb.WithProviderEventHub(new EventHubMessageBusSettings(eventHubConnectionString, storageConnectionString, storageContainerName));
// after
mbb.WithProviderEventHub(cfg =>
{
cfg.ConnectionString = eventHubConnectionString;
cfg.StorageConnectionString = storageConnectionString;
cfg.StorageBlobContainerName = storageContainerName;
});
// before
mbb.WithProviderKafka(new KafkaMessageBusSettings(kafkaBrokers));
// after
mbb.WithProviderKafka(cfg =>
{
cfg.BrokerList = kafkaBrokers;
}
// before
mbb.WithProviderRedis(new RedisMessageBusSettings(redisConnectionString));
// after
mbb.WithProviderRedis(cfg =>
{
cfg.ConnectionString = redisConnectionString;
});
Ad 1.2.
Old way:
// Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Set the MessageBus provider, so that IMessageBus are resolved from the current request scope
MessageBus.SetProvider(MessageBusCurrentProviderBuilder.Create().From(app).Build());
}
New way:
services.AddSlimMessageBus(mbb =>
{
mbb.AddAspNet();
});
services.AddHttpContextAccessor(); // This is required for the SlimMessageBus.Host.AspNetCore plugin
Host.Transport-2.0.0-rc8: Extract configuration model into separate package
- SMB uses Microsoft.Extensions.DependencyInjection.Abstractions at the core.
1.2. Removed Unity and Autofac plugins.
1.2. Repurpose theSlimMessageBus.Host.AspNetCore
plugin to just configure theMessageBus.Current
static accessor. - Incorporated hybrid transport into the core transport implementation (#161).
- An implementation of
IHostedService
is registered that starts consumers when used with the .NET Generic Host. - Support for requests that do not have a response type associated with it (new types
IRequestHandler<TRequest>
,IRequest
). - The
IRequest<TResponse>
is the new replacement forIRequestMessage<TResponse>
- please migrate. - Streamlined the bus configuration - several improvements to the
services.AddSlimMessageBus(mbb => {})
:
6.1. Theservices.AddSlimMessageBus(mbb => { })
can be used multiple times and the end result will be additive (internally it usesservices.TryAddTransient()
)
6.2. TheMessageBusBuilder
is registered in the MSDI
6.3. Incorporated services registration for MSDI inside.AddSlimMessageBus()
- this helps to put all the bus and plugin setup in one place.
6.4. TheIMessageBusConfigurator
has been removed - adding severalservices.AddSlimMessageBus(mbb => {})
allows achieving modularization.
6.5. Separation of bus configuration (declaring producers, consumers) away from MSDI services registration - this allows registering interceptor plugins in the MSDI from introspecting the actual producers, consumers, and their settings.
6.6. SMB can assume the consumer type ofIConsumer<TMessage>
and hence the.WithConsumer<SomeConsumer>()
can be skipped most of the time. - Upgrade the underlying transport client libraries to the latest versions (Redis, Kafka, Azure Service Bus, Azure Event Hub).
- Kafka default header serializer (#157).
- [Host.Outbox] Registers publish/consume interceptors only for the message types for which the producer opted in for outbox, and for consumers that opted in for transaction scope (optimization).
Ad 1.1. & 2.
Uninstall packages:
SlimMessageBus.Host.Autofac
SlimMessageBus.Host.Unity
SlimMessageBus.Host.MsDependencyInjection
SlimMessageBus.Host.FluentValidation.MsDependencyInjection
SlimMessageBus.Host.Hybrid
Ad 1.2.
Old way:
// Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Set the MessageBus provider, so that IMessageBus are resolved from the current request scope
MessageBus.SetProvider(MessageBusCurrentProviderBuilder.Create().From(app).Build());
}
New way:
services.AddSlimMessageBus(mbb =>
{
mbb.AddAspNet();
});
services.AddHttpContextAccessor(); // This is required for the SlimMessageBus.Host.AspNetCore plugin
Ad 3.
The request processing will be awaited during .Send()
, however, no response will be returned. If an exception were to happen on the handler side the exception will be thrown by the .Send()
.
Consider the following example:
// The request has to use the IRequest interface
public class SomeRequest : IRequest
{
}
// The handler has to use IRequestHandler<T> interface
public class SomeRequestHandler : IRequestHandler<SomeRequest>
{
public async Task OnHandle(SomeRequest request)
{
// no response returned
}
}
// The request is declared on the bus builder (for the producer side)
mbb.Produce<SomeRequest>(x =>
{
x.DefaultTopic("topic");
})
// The request handler is declared on the bus builder (for the consumer side)
mbb.Handle<SomeRequest>(x => x
.Topic("topic") // Topic to expect the requests on
//.WithHandler<SomeRequestHandler>()
.KafkaGroup("some-consumer-group") // kafka provider specific
);
// Usage example for the producer side
await bus.Send(new SampleRequest());
Ad 8.
Old way:
services.AddSlimMessageBus((mbb, svp) =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
.WithConsumer<CustomerCreatedEventConsumer>() // Change (1)
.SubscriptionName("sub");
});
mbb.WithSerializer(new JsonMessageSerializer()); // Change (2)
}, addConsumersFromAssembly: new[] { Assembly.GetExecutingAssembly() }); // Change (3)
New way:
services.AddSlimMessageBus(mbb =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
// The line below is now optional (1)
// .WithConsumer<CustomerCreatedEventConsumer>() // Not needed, the IConsumer<CustomerCreatedEvent> will be looked up in DI
.SubscriptionName("sub");
});
mbb.AddServicesFromAssembly(Assembly.GetExecutingAssembly())); // (3)
mbb.AddJsonMessageSerializer(); // requires SlimMessageBus.Host.Serialization.Json package // (2)
});
Also, the .AddServicesFromAssembly()
will register both CustomerCreatedEventConsumer
and IConsumer<CustomerCreatedEvent>
service types in the MSDI.
Host-Transport-2.0.0-rc7: Improve configuration experience & lifecycle
- SMB uses Microsoft.Extensions.DependencyInjection.Abstractions at the core.
1.2. Removed Unity and Autofac plugins.
1.2. Repurpose theSlimMessageBus.Host.AspNetCore
plugin to just configure theMessageBus.Current
static accessor. - An implementation of
IHostedService
is registered that starts consumers when used with the .NET Generic Host. - Support for requests that do not have a response type associated with it (new types
IRequestHandler<TRequest>
,IRequest
). - The
IRequest<TResponse>
is the new replacement forIRequestMessage<TResponse>
- please migrate. - Streamlined the bus configuration - several improvements to the
services.AddSlimMessageBus(mbb => {})
:
8.1. Theservices.AddSlimMessageBus(mbb => { })
can be used multiple times and the end result will be additive (internally it usesservices.TryAddTransient()
)
8.2. TheMessageBusBuilder
is registered in the MSDI
8.3. Incorporated services registration for MSDI inside.AddSlimMessageBus()
- this helps to put all the bus and plugin setup in one place.
8.4. TheIMessageBusConfigurator
has been removed - adding severalservices.AddSlimMessageBus(mbb => {})
allows achieving modularization.
8.5. Separation of bus configuration (declaring producers, consumers) away from MSDI services registration - this allows registering interceptor plugins in the MSDI from introspecting the actual producers, consumers, and their settings.
8.6. SMB can assume the consumer type ofIConsumer<TMessage>
and hence the.WithConsumer<SomeConsumer>()
can be skipped most of the time. - Upgrade the underlying transport client libraries to the latest versions (Redis, Kafka, Azure Service Bus, Azure Event Hub).
- Kafka default header serializer (#157).
- [Host.Outbox] Registers publish/consume interceptors only for the message types for which the producer opted in for outbox, and for consumers that opted in for transaction scope (optimization).
Ad 1.1.
Uninstall packages:
SlimMessageBus.Host.Autofac
SlimMessageBus.Host.Unity
SlimMessageBus.Host.MsDependencyInjection
SlimMessageBus.Host.FluentValidation.MsDependencyInjection
Ad 1.2.
Old way:
// Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Set the MessageBus provider, so that IMessageBus are resolved from the current request scope
MessageBus.SetProvider(MessageBusCurrentProviderBuilder.Create().From(app).Build());
}
New way:
services.AddSlimMessageBus(mbb =>
{
mbb.AddAspNet();
});
services.AddHttpContextAccessor(); // This is required for the SlimMessageBus.Host.AspNetCore plugin
Ad 3.
The request processing will be awaited during .Send()
, however, no response will be returned. If an exception were to happen on the handler side the exception will be thrown by the .Send()
.
Consider the following example:
// The request has to use the IRequest interface
public class SomeRequest : IRequest
{
}
// The handler has to use IRequestHandler<T> interface
public class SomeRequestHandler : IRequestHandler<SomeRequest>
{
public async Task OnHandle(SomeRequest request)
{
// no response returned
}
}
// The request is declared on the bus builder (for the producer side)
mbb.Produce<SomeRequest>(x =>
{
x.DefaultTopic("topic");
})
// The request handler is declared on the bus builder (for the consumer side)
mbb.Handle<SomeRequest>(x => x
.Topic("topic") // Topic to expect the requests on
//.WithHandler<SomeRequestHandler>()
.KafkaGroup("some-consumer-group") // kafka provider specific
);
// Usage example for the producer side
await bus.Send(new SampleRequest());
Ad 8.
Old way:
services.AddSlimMessageBus((mbb, svp) =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
.WithConsumer<CustomerCreatedEventConsumer>() // Change (1)
.SubscriptionName("sub");
});
mbb.WithSerializer(new JsonMessageSerializer()); // Change (2)
}, addConsumersFromAssembly: new[] { Assembly.GetExecutingAssembly() }); // Change (3)
New way:
services.AddSlimMessageBus(mbb =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
// The line below is now optional (1)
// .WithConsumer<CustomerCreatedEventConsumer>() // Not needed, the IConsumer<CustomerCreatedEvent> will be looked up in DI
.SubscriptionName("sub");
});
mbb.AddServicesFromAssembly(Assembly.GetExecutingAssembly())); // (3)
mbb.AddJsonMessageSerializer(); // requires SlimMessageBus.Host.Serialization.Json package // (2)
});
Also, the .AddServicesFromAssembly()
will register both CustomerCreatedEventConsumer
and IConsumer<CustomerCreatedEvent>
service types in the MSDI.
Host-Transport-2.0.0-rc6: Adjust docs
- SMB uses Microsoft.Extensions.DependencyInjection.Abstractions at the core.
- Removed Unity and Autofac plugins.
- Repurpose the
SlimMessageBus.Host.AspNetCore
plugin to just configure theMessageBus.Current
static accessor. - An implementation of
IHostedService
is registered that starts consumers when used with the .NET Generic Host. - SMB can assume the consumer type of
IConsumer<TMessage>
and hence the.WithConsumer<SomeConsumer>()
can be skipped most of the time. - Support for requests that do not have a response type associated with it (new types
IRequestHandler<TRequest>
,IRequest
) - The
IRequest<TResponse>
is the new replacement forIRequestMessage<TResponse>
(please migrate). - Streamlined the bus configuration (see more below).
- Upgrade the underlying transport client libraries to the latest versions (Redis, Kafka, Azure Service Bus, Azure Event Hub).
- Kafka default header serializer (#157).
Ad 1 and 2.
Uninstall packages:
SlimMessageBus.Host.Autofac
SlimMessageBus.Host.Unity
SlimMessageBus.Host.MsDependencyInjection
SlimMessageBus.Host.FluentValidation.MsDependencyInjection
Ad 5 and 8.
Old way:
services.AddSlimMessageBus((mbb, svp) =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
.WithConsumer<CustomerCreatedEventConsumer>() // Change (1)
.SubscriptionName("sub");
});
mbb.WithSerializer(new JsonMessageSerializer()); // Change (2)
}, addConsumersFromAssembly: new[] { Assembly.GetExecutingAssembly() }); // Change (3)
New way:
services.AddSlimMessageBus(mbb =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
// The line below is now optional (1)
// .WithConsumer<CustomerCreatedEventConsumer>() // Not needed, the IConsumer<CustomerCreatedEvent> will be looked up in DI
.SubscriptionName("sub");
});
mbb.AddServicesFromAssembly(Assembly.GetExecutingAssembly())); // (3)
mbb.AddJsonMessageSerializer(); // requires SlimMessageBus.Host.Serialization.Json package // (2)
});
Also, the .AddServicesFromAssembly()
will register both CustomerCreatedEventConsumer
and IConsumer<CustomerCreatedEvent>
service types in the MSDI.
Ad 3.
Old way:
// Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Set the MessageBus provider, so that IMessageBus are resolved from the current request scope
MessageBus.SetProvider(MessageBusCurrentProviderBuilder.Create().From(app).Build());
}
New way:
services.AddSlimMessageBus(mbb =>
{
mbb.AddAspNet();
});
services.AddHttpContextAccessor(); // This is required for the SlimMessageBus.Host.AspNetCore plugin
Ad 6.
The request processing will be awaited during .Send()
, however, no response will be returned. If an exception were to happen on the handler side the exception will be thrown by the .Send()
.
Consider the following example:
// The request has to use the IRequest interface
public class SomeRequest : IRequest
{
}
// The handler has to use IRequestHandler<T> interface
public class SomeRequestHandler : IRequestHandler<SomeRequest>
{
public async Task OnHandle(SomeRequest request)
{
// no response returned
}
}
// The request is declared on the bus builder (for the producer side)
mbb.Produce<SomeRequest>(x =>
{
x.DefaultTopic("topic");
})
// The request handler is declared on the bus builder (for the consumer side)
mbb.Handle<SomeRequest>(x => x
.Topic("topic") // Topic to expect the requests on
//.WithHandler<SomeRequestHandler>()
.KafkaGroup("some-consumer-group") // kafka provider specific
);
// Usage example for the producer side
await bus.Send(new SampleRequest());
Ad 8.
- The
.AddSlimMessageBus()
- configuration lambda is wrapped and registered as an
IMessageBusConfigurator
in MSDI. - can be used multiple times (internally it uses
services.TryAddTransient()
) - has a parameterless overload if used purely with
IMessageBusConfigurator
modular approach - The
MessageBusBuilder
is registered in the MSDI
- configuration lambda is wrapped and registered as an
- All the serializers can be added to MSDI using respective extension methods (
.AddMessageBusJsonSerializer()
,.AddMessageBusAvroSerializer()
, etc). - The
services.AddSlimMessageBus(mbb => { })
can be used multiple times and the end result will be additive. - The plugins can be registered under the
AddSlimMessageBus()
- this is to keep all the relevant SMB plugins in one place.
Host.Transport-2.0.0-rc4: Configuration improvements
- SMB uses Microsoft.Extensions.DependencyInjection.Abstractions at the core.
- Remove Unity and Autofac plugins.
- Repurpose the
SlimMessageBus.Host.AspNetCore
plugin to just configure theMessageBus.Current
static accessor. - An implementation of
IHostedService
is registered that starts consumers when used with the .NET Generic Host. - SMB can assume the consumer type of
IConsumer<TMessage>
and hence the.WithConsumer<SomeConsumer>()
can be skipped most of the time. - Support for requests that do not have a response type associated with it (new types
IRequestHandler<TRequest>
,IRequest
) - The
IRequest<TResponse>
is the new replacement forIRequestMessage<TResponse>
(please migrate). - Streamlined the bus configuration.
Ad 1 and 2.
Uninstall packages:
SlimMessageBus.Host.Autofac
SlimMessageBus.Host.Unity
SlimMessageBus.Host.MsDependencyInjection
Ad 5 and 8.
Old way:
services.AddSlimMessageBus((mbb, svp) =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
.WithConsumer<CustomerCreatedEventConsumer>() // Change (1)
.SubscriptionName("sub");
});
mbb.WithSerializer(new JsonMessageSerializer()); // Change (2)
}, addConsumersFromAssembly: new[] { Assembly.GetExecutingAssembly() }); // Change (3)
New way:
services.AddSlimMessageBus((mbb, svp) =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
// The line below is now optional (1)
// .WithConsumer<CustomerCreatedEventConsumer>() // Not needed, the IConsumer<CustomerCreatedEvent> will be looked up in DI
.SubscriptionName("sub");
});
});
services.AddMessageBusServicesFromAssembly(Assembly.GetExecutingAssembly())); // (3)
services.AddMessageBusJsonMessageSerializer(); // requires SlimMessageBus.Host.Serialization.Json package // (2)
Also, the .AddMessageBusServicesFromAssembly()
will register both CustomerCreatedEventConsumer
and IConsumer<CustomerCreatedEvent>
service types in the MSDI.
Ad 3.
Old way:
// Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Set the MessageBus provider, so that IMessageBus are resolved from the current request scope
MessageBus.SetProvider(MessageBusCurrentProviderBuilder.Create().From(app).Build());
}
New way:
services.AddHttpContextAccessor(); // This is required for the SlimMessageBus.Host.AspNetCore plugin
services.AddMessageBusAspNet();
Ad 6.
The request processing will be awaited during .Send()
, however, no response will be returned. If an exception were to happen on the handler side the exception will be thrown by the .Send()
.
Consider the following example:
// The request has to use the IRequest interface
public class SomeRequest : IRequest
{
}
// The handler has to use IRequestHandler<T> interface
public class SomeRequestHandler : IRequestHandler<SomeRequest>
{
public async Task OnHandle(SomeRequest request)
{
// no response returned
}
}
// The request is declared on the bus builder (for the producer side)
mbb.Produce<SomeRequest>(x =>
{
x.DefaultTopic("topic");
})
// The request handler is declared on the bus builder (for the consumer side)
mbb.Handle<SomeRequest>(x => x
.Topic("topic") // Topic to expect the requests on
//.WithHandler<SomeRequestHandler>()
.KafkaGroup("some-consumer-group") // kafka provider specific
);
// Usage example for the producer side
await bus.Send(new SampleRequest());
Ad 8.
- The
.AddSlimMessageBus()
- configuration lambda is wrapped and registered as an
IMessageBusConfigurator
in MSDI. - can be used multiple times (internally it uses
services.TryAddTransient()
) - has a parameterless overload if used purely with
IMessageBusConfigurator
modular approach - The
MessageBusBuilder
is registered in the MSDI
- configuration lambda is wrapped and registered as an
- All the serializers can be added to MSDI using respective extension methods (
.AddMessageBusJsonSerializer()
,.AddMessageBusAvroSerializer()
, etc). - All the plugins have a uniform set of extension methods that start with
.AddMessageBusXxxx()
to easily identify what comes from SMB.
Host-Transport-2.0.0-rc5: Upgrade the underlying transport client libraries
- SMB uses Microsoft.Extensions.DependencyInjection.Abstractions at the core.
- Removed Unity and Autofac plugins.
- Repurpose the
SlimMessageBus.Host.AspNetCore
plugin to just configure theMessageBus.Current
static accessor. - An implementation of
IHostedService
is registered that starts consumers when used with the .NET Generic Host. - SMB can assume the consumer type of
IConsumer<TMessage>
and hence the.WithConsumer<SomeConsumer>()
can be skipped most of the time. - Support for requests that do not have a response type associated with it (new types
IRequestHandler<TRequest>
,IRequest
) - The
IRequest<TResponse>
is the new replacement forIRequestMessage<TResponse>
(please migrate). - Streamlined the bus configuration.
- Upgrade the underlying transport client libraries to latest versions (Redis, Kafka, Azure Service Bus, Azure Event Hub).
Ad 1 and 2.
Uninstall packages:
SlimMessageBus.Host.Autofac
SlimMessageBus.Host.Unity
SlimMessageBus.Host.MsDependencyInjection
Ad 5 and 8.
Old way:
services.AddSlimMessageBus((mbb, svp) =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
.WithConsumer<CustomerCreatedEventConsumer>() // Change (1)
.SubscriptionName("sub");
});
mbb.WithSerializer(new JsonMessageSerializer()); // Change (2)
}, addConsumersFromAssembly: new[] { Assembly.GetExecutingAssembly() }); // Change (3)
New way:
services.AddSlimMessageBus((mbb, svp) =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
// The line below is now optional (1)
// .WithConsumer<CustomerCreatedEventConsumer>() // Not needed, the IConsumer<CustomerCreatedEvent> will be looked up in DI
.SubscriptionName("sub");
});
});
services.AddMessageBusServicesFromAssembly(Assembly.GetExecutingAssembly())); // (3)
services.AddMessageBusJsonMessageSerializer(); // requires SlimMessageBus.Host.Serialization.Json package // (2)
Also, the .AddMessageBusServicesFromAssembly()
will register both CustomerCreatedEventConsumer
and IConsumer<CustomerCreatedEvent>
service types in the MSDI.
Ad 3.
Old way:
// Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Set the MessageBus provider, so that IMessageBus are resolved from the current request scope
MessageBus.SetProvider(MessageBusCurrentProviderBuilder.Create().From(app).Build());
}
New way:
services.AddHttpContextAccessor(); // This is required for the SlimMessageBus.Host.AspNetCore plugin
services.AddMessageBusAspNet();
Ad 6.
The request processing will be awaited during .Send()
, however, no response will be returned. If an exception were to happen on the handler side the exception will be thrown by the .Send()
.
Consider the following example:
// The request has to use the IRequest interface
public class SomeRequest : IRequest
{
}
// The handler has to use IRequestHandler<T> interface
public class SomeRequestHandler : IRequestHandler<SomeRequest>
{
public async Task OnHandle(SomeRequest request)
{
// no response returned
}
}
// The request is declared on the bus builder (for the producer side)
mbb.Produce<SomeRequest>(x =>
{
x.DefaultTopic("topic");
})
// The request handler is declared on the bus builder (for the consumer side)
mbb.Handle<SomeRequest>(x => x
.Topic("topic") // Topic to expect the requests on
//.WithHandler<SomeRequestHandler>()
.KafkaGroup("some-consumer-group") // kafka provider specific
);
// Usage example for the producer side
await bus.Send(new SampleRequest());
Ad 8.
- The
.AddSlimMessageBus()
- configuration lambda is wrapped and registered as an
IMessageBusConfigurator
in MSDI. - can be used multiple times (internally it uses
services.TryAddTransient()
) - has a parameterless overload if used purely with
IMessageBusConfigurator
modular approach - The
MessageBusBuilder
is registered in the MSDI
- configuration lambda is wrapped and registered as an
- All the serializers can be added to MSDI using respective extension methods (
.AddMessageBusJsonSerializer()
,.AddMessageBusAvroSerializer()
, etc). - All the plugins have a uniform set of extension methods that start with
.AddMessageBusXxxx()
to easily identify what comes from SMB.