DT.SimpleEventBus
1.0.0
dotnet add package DT.SimpleEventBus --version 1.0.0
NuGet\Install-Package DT.SimpleEventBus -Version 1.0.0
<PackageReference Include="DT.SimpleEventBus" Version="1.0.0" />
<PackageVersion Include="DT.SimpleEventBus" Version="1.0.0" />
<PackageReference Include="DT.SimpleEventBus" />
paket add DT.SimpleEventBus --version 1.0.0
#r "nuget: DT.SimpleEventBus, 1.0.0"
#:package DT.SimpleEventBus@1.0.0
#addin nuget:?package=DT.SimpleEventBus&version=1.0.0
#tool nuget:?package=DT.SimpleEventBus&version=1.0.0
🚌 SimpleEventBus
SimpleEventBus — это лёгкая, потокобезопасная шина событий для .NET, предназначенная для реализации паттерна Publish-Subscribe в приложениях любой сложности.
Идеально подходит для DDD (Domain-Driven Design) и Clean Architecture, так как не навязывает зависимостей домену и позволяет гибко управлять реакциями на события.
✨ Возможности
- ✅ Поддержка синхронной и асинхронной обработки событий
- ✅ Отмена подписки через
Unsubscribe(Guid) - ✅ Поддержка
CancellationTokenв асинхронных операциях - ✅ Встроенное логгирование через
ILogger<T>(опционально) - ✅ Потокобезопасность — можно использовать в многопоточных приложениях
- ✅ Регистрация в DI как Singleton
- ✅ Нет зависимости от домена — события могут быть любыми типами (
record,class) - ✅ Подписка в конструкторе сервиса — идеально для DDD-обработчиков
📦 Установка
Установите пакет через .NET CLI:
dotnet add package SimpleEventBus
Или через Package Manager Console:
Install-Package SimpleEventBus
Быстрый старт
- Определите событие (в сборке Domain)
// Domain/Events/OrderCompleted.cs
namespace YourApp.Domain.Events;
// Чистый record — без зависимостей!
public record OrderCompleted(Guid OrderId, DateTime CompletedAt);
- Создайте обработчик в Application
// Application/Handlers/OrderCompletedHandler.cs
using SimpleEventBus;
using YourApp.Domain.Events;
namespace YourApp.Application.Handlers;
public class OrderCompletedHandler
{
public OrderCompletedHandler(IEventBus eventBus)
{
// 🔥 Подписка прямо в конструкторе!
eventBus.SubscribeAsync<OrderCompleted>(HandleAsync);
}
private async Task HandleAsync(OrderCompleted @event, CancellationToken ct = default)
{
// Реакция на событие: отправка email, обновление кэша и т.д.
await Console.Out.WriteLineAsync($"📨 Заказ {@event.OrderId} завершён!");
}
}
- Опубликуйте событие из Infrastructure (например, в UnitOfWork)
// Infrastructure/UnitOfWork.cs
using SimpleEventBus;
using YourApp.Domain;
public class UnitOfWork
{
private readonly IEventBus _eventBus;
// ... другие зависимости
public UnitOfWork(IEventBus eventBus)
{
_eventBus = eventBus;
}
public async Task SaveChangesAsync(CancellationToken ct = default)
{
// 1. Сохраняем изменения в БД
// await _dbContext.SaveChangesAsync(ct);
// 2. Публикуем все накопленные domain events
foreach (var domainEvent in GetPendingDomainEvents())
{
await _eventBus.PublishAsync(domainEvent, ct);
}
}
}
- Настройка в Program.cs (ASP.NET Core)
var builder = WebApplication.CreateBuilder(args);
// Регистрация EventBus как Singleton
builder.Services.AddEventBus(options =>
{
options.EnableLogging = true; // по умолчанию true
});
// Регистрация обработчиков (как Singleton!)
builder.Services.AddSingleton<OrderCompletedHandler>();
// ... остальные сервисы
var app = builder.Build();
app.Run();
🔌 Расширенные сценарии
Работа с Scoped-зависимостями в обработчике Если обработчик должен использовать Scoped-сервисы (например, DbContext), используйте IServiceScopeFactory:
public class OrderCompletedHandler
{
public OrderCompletedHandler(IEventBus eventBus, IServiceScopeFactory scopeFactory)
{
eventBus.SubscribeAsync<OrderCompleted>(async (@event, ct) =>
{
using var scope = scopeFactory.CreateScope();
var emailService = scope.ServiceProvider.GetRequiredService<IEmailService>();
await emailService.SendAsync(@event.OrderId, ct);
});
}
}
Регистрация:
builder.Services.AddSingleton<OrderCompletedHandler>();
builder.Services.AddScoped<IEmailService, SmtpEmailService>();
Отключение логгирования
builder.Services.AddEventBus(options => options.EnableLogging = false);
Отмена подписки (редко нужно)
var subscriptionId = eventBus.Subscribe<MyEvent>(Handler);
// ...
eventBus.Unsubscribe(subscriptionId);
| 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 | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- Microsoft.Extensions.Logging (>= 9.0.9)
- Microsoft.Extensions.Options (>= 9.0.9)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 270 | 10/10/2025 |