Releases: zarusz/SlimMessageBus
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.
Host.Transport-2.0.0-rc3
- 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).
Ad 5.
services.AddSlimMessageBus((mbb, svp) =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
// The line below is now optional
// .WithConsumer<CustomerCreatedEventConsumer>()
.SubscriptionName("sub");
});
}, addConsumersFromAssembly: new[] { Assembly.GetExecutingAssembly() });
With this change, the addConsumersFromAssembly
will register both CustomerCreatedEventConsumer
and IConsumer<CustomerCreatedEvent>
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());
Host.Transport-2.0.0-rc2
- SMB uses Microsoft.Extensions.DependencyInjection.Abstractions at the core.
- Remove Unity and Autofac plugins.
- An implementation if
IHostedService
us registered that starts consumers when used with the .NET Generic Host. - Repurpose the
SlimMessageBus.Host.AspNetCore
plugin to just configure theMessageBus.Current
static accessor. - SMB can assume the consumer type of
IConsumer<TMessage>
and hence the.WithConsumer<SomeConsumer>()
can be skipped most of the time.
Before:
services.AddSlimMessageBus((mbb, svp) =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
.WithConsumer<CustomerCreatedEventConsumer>() // <------- this
.SubscriptionName("sub");
});
}, addConsumersFromAssembly: new[] { Assembly.GetExecutingAssembly() });
After:
services.AddSlimMessageBus((mbb, svp) =>
{
mbb.Consume<CustomerCreatedEvent>(x => x
.Topic(topic)
.SubscriptionName("sub");
});
}, addConsumersFromAssembly: new[] { Assembly.GetExecutingAssembly() });
With this change, the addConsumersFromAssembly
will register both CustomerCreatedEventConsumer
and IConsumer<CustomerCreatedEvent>
in the MSDI.
Breaking change for MessageBus.Current
setup:
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();
Host.Transport-2.0.0-rc1: Move to Microsoft.Extensions.DependencyInjection
- SMB uses Microsoft.Extensions.DependencyInjection.Abstractions at the core for managing dependencies
- Remove Unity and Autofac plugins
- Register
IHostedService
that starts consumers when used with the .NET Generic Host - Repurpose the SlimMessageBus.Host.AspNetCore plugin to just configure the
MessageBus.Current
- Minor improvements for disposing of consumers.
Breaking changes:
- The
MessageBus.Current
is setup in a simpler way now:
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();
Host.Transport-1.22.1
- [Host.Redis] Fix for Redis error log #140
Host.Transport-1.22.0
Host.Transport-1.21.0
Host.Transport-1.19.3
- [Host.AzureServiceBus] Expose topology provision trigger (#124)
- [Host.AzureServiceBus] Ability to manually trigger topology creation
- [Host.AzureServiceBus] Improve topology provisioning edge case
- [Host.Kafka] Fixes to handling error responses in request-response
Host.Transport-1.19.1
Host.Transport-1.19.0
- Ability to create Azure Service Bus topology (queue/topic/subscription) #38