tRebbit 1.0.1
dotnet add package tRebbit --version 1.0.1
NuGet\Install-Package tRebbit -Version 1.0.1
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="tRebbit" Version="1.0.1" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="tRebbit" Version="1.0.1" />
<PackageReference Include="tRebbit" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add tRebbit --version 1.0.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: tRebbit, 1.0.1"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package tRebbit@1.0.1
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=tRebbit&version=1.0.1
#tool nuget:?package=tRebbit&version=1.0.1
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
tRebbit
.NET Standart library for subscribing/publishing messages to RabbitMq. Under the hood uses official RabbitMq .NET client, but provides more abstract interface.
Goals
- Simplify publising/subscribing to events, without referring to RabbitMq building blocks.
- Provide basic implementation wich could be extended.
Main features
- Separated abstractions and implementations into different libraries. It allows you to use interfaces only inside Application/Domain Layer and bind them to implemenrations only inside Infrastructure Layer.
- Dead-lettering is optional and could help to keep track of failures during original event processing.
- IServiceCollection.AddEventBus helps to hook up everything in single place to be good to go.
- In-memory subscription management keeps track of events/handles registered by your app.
- IIntegrationEventHandler is a basic interface to implement for particular type of event to handle.
- Is not opinionated about resillience library or approach you use by accepting delegates for this from client code.
Sample
- Define event message by inheriting IntegrationEvent type:
public class PaymentCompletedEvent : IntegrationEvent
{
public decimal PayAmount { get; private set; }
public string UserId { get; private set; }
public PaymentCompletedEvent(decimal payAmount, string userId)
{
PayAmount = payAmount;
UserId = userId;
}
}
- Define event handles by implementing IIntegrationEventHandler interface:
public class PaymentCompletedIntegrationEventHandler :
IIntegrationEventHandler<PaymentCompletedEvent>
{
public Task Handle(PaymentCompletedEvent @event, bool isFirstDispatch)
{
// uncomment to see how event flows into DLX
//throw new ArgumentNullException();
Console.WriteLine("Payment completed");
Console.WriteLine(System.Text.Json.JsonSerializer.Serialize(@event));
return Task.CompletedTask;
}
}
- Register event handles with DI:
services.AddScoped<PaymentCompletedIntegrationEventHandler>();
- Wire up everything by calling .AddEventBus:
services.AddEventBus(
exchangeName: "your_exchange_name",
queueName: "your_task_queue_name",
config: new RabbitMqConfig
{
Connection = "localhost",
UserName = "guest",
Password = "guest"
},
resillientConnectionPolicyAction: , // here place reference to resillience action which will handle connections, for example RetryPolicy.Execute
resillientPublishPolicyAction: , // here place reference to resillience action which will handle publishes, for example RetryPolicy.Execute
preprocessAction: // any preprocess action before event is actually handled by your custom event handles
);
- Usage:
static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
var serviceProvider = host.Services;
var eventBus = serviceProvider.GetRequiredService<IEventBus>();
// subscribe
eventBus.Subscribe<PaymentCompletedEvent,
PaymentCompletedIntegrationEventHandler>();
eventBus.ActivateSubscriptionChannel();
// publish
eventBus.Publish(new PaymentCompletedEvent(100.0m, "bchornii"));
Console.Read();
}
static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((_, services) =>
{
var connectionRetryPolicy = RetryPolicy.Handle<SocketException>()
.Or<BrokerUnreachableException>()
.WaitAndRetry(5, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (ex, time) =>
{
Console.WriteLine($"RabbitMQ Client could not connect after {time.TotalSeconds:n1}s ({ex.Message})");
});
var publishRetryPolicy = RetryPolicy.Handle<SocketException>()
.Or<BrokerUnreachableException>()
.WaitAndRetry(5, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (ex, time) =>
{
Console.WriteLine($"RabbitMQ Client could not connect after {time.TotalSeconds:n1}s ({ex.Message})");
});
services.AddScoped<PaymentCompletedIntegrationEventHandler>();
services.AddEventBus(
exchangeName: "bc_exchange",
queueName: "bc_default_queue",
config: new RabbitMqConfig
{
Connection = "localhost",
UserName = "guest",
Password = "guest"
},
resillientConnectionPolicyAction: connectionRetryPolicy.Execute,
resillientPublishPolicyAction: publishRetryPolicy.Execute,
preprocessAction: (s, o) => Task.CompletedTask);
});
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 5.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 5.0.0)
- RabbitMQ.Client (>= 6.2.1)
- tRebbit.Abstractions (>= 1.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.