{"id":25549661,"url":"https://github.com/netlah/event-aggregator","last_synced_at":"2025-04-11T21:01:39.217Z","repository":{"id":50121779,"uuid":"365419211","full_name":"NetLah/event-aggregator","owner":"NetLah","description":"Event Aggregator for dotnet, intergrated with Scoped DependencyInjection in .NETCore and ASP.NETCore","archived":false,"fork":false,"pushed_at":"2024-03-21T08:19:43.000Z","size":80,"stargazers_count":6,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-25T16:55:36.658Z","etag":null,"topics":["aggregator","aspnetcore","dotnet","event","event-aggregator","event-sourcing","netcore","nuget","sourcing"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NetLah.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-05-08T04:35:00.000Z","updated_at":"2024-03-05T09:42:42.000Z","dependencies_parsed_at":"2024-01-13T10:55:52.783Z","dependency_job_id":null,"html_url":"https://github.com/NetLah/event-aggregator","commit_stats":{"total_commits":41,"total_committers":1,"mean_commits":41.0,"dds":0.0,"last_synced_commit":"02ef03f6fa095d2c0f7b02f639d174747c815683"},"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetLah%2Fevent-aggregator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetLah%2Fevent-aggregator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetLah%2Fevent-aggregator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NetLah%2Fevent-aggregator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NetLah","download_url":"https://codeload.github.com/NetLah/event-aggregator/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248480434,"owners_count":21110936,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aggregator","aspnetcore","dotnet","event","event-aggregator","event-sourcing","netcore","nuget","sourcing"],"created_at":"2025-02-20T10:19:17.473Z","updated_at":"2025-04-11T21:01:38.802Z","avatar_url":"https://github.com/NetLah.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NetLah.Extensions.EventAggregator - .NET Library\n\n[NetLah.Extensions.EventAggregator](https://www.nuget.org/packages/NetLah.Extensions.EventAggregator/) is a library which contains a set of reusable classes implement Event Aggregator pattern integrated with dependency injection `Microsoft.Extensions.DependencyInjection`. These classes/interface are `IEventAggregator`, `IRootEventAggregator`, `IAsyncSubscriber`, `ISubscriber`.\n\n## Nuget package\n\n[![NuGet](https://img.shields.io/nuget/v/NetLah.Extensions.EventAggregator.svg?style=flat-square\u0026label=nuget\u0026colorB=00b200)](https://www.nuget.org/packages/NetLah.Extensions.EventAggregator/)\n\n## Build Status\n\n[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2FNetLah%2Fevent-aggregator%2Fbadge%3Fref%3Dmain\u0026style=flat)](https://actions-badge.atrox.dev/NetLah/event-aggregator/goto?ref=main)\n\n## Getting started\n\n### Scoped and singleton\n\n```C#\nservices.AddEventAggregator();\n\nservices.AddSingleton\u003cRootEvent1Subscriber\u003e();\nservices.SubscribeAsync\u003cBaseEvent1, RootEvent1Subscriber\u003e(lifetime: SubscriberLifetime.Singleton);\n\nservices.AddScoped\u003cEvent1Subscriber\u003e();             // IAsyncSubscriber\u003cTEvent\u003e\nservices.AddScoped\u003cEvent2Subscriber\u003e();             // ISubscriber\u003cTEvent\u003e\nservices.AddScoped\u003cEvent3Subscriber\u003e();             // IAsyncSubscriber\u003cTEvent\u003e\nservices.AddScoped\u003cEvent4Subscriber\u003e();             // ISubscriber\u003cTEvent\u003e\n\nservices.SubscribeAsync\u003cEvent1, Event1Subscriber\u003e();\nservices.Subscribe\u003cEvent2, Event2Subscriber\u003e();\nservices.SubscribeAsync\u003cIEvent3\u003e(\n    (ev, sp, ct) =\u003e sp.GetRequiredService\u003cEvent3Subscriber\u003e().HandleAsync(ev, ct));\nservices.Subscribe\u003cEvent4\u003e(\n    (ev, sp) =\u003e sp.GetRequiredService\u003cEvent4Subscriber\u003e().Handle(ev));\n\n// IEventAggregator eventAggregator\n// both RootEvent1Subscriber and Event1Subscriber subscribe on Event1\nawait eventAggregator.PublishAsync(new Event1 { Message = message1 });\nawait eventAggregator.PublishAsync(new Event2 { Payload = payload2 });\nawait eventAggregator.PublishAsync(new Event3());\nawait eventAggregator.PublishAsync(new Event4());\n```\n\n### Singleton only\n\n```C#\nservices.AddEventAggregator();\n\nservices.AddSingleton\u003cRootEvent1Subscriber\u003e();      // IAsyncSubscriber\u003cTEvent\u003e\nservices.AddSingleton\u003cRootEvent2Subscriber\u003e();\nservices.SubscribeAsync\u003cEvent1, RootEvent1Subscriber\u003e(lifetime: SubscriberLifetime.Singleton);\nservices.Subscribe\u003cEvent2\u003e(\n    (ev, sp) =\u003e sp.GetRequiredService\u003cRootEvent2Subscriber\u003e().Handle(ev),\n    lifetime: SubscriberLifetime.Singleton);\n\n// IRootEventAggregator rootEventAggregator\nawait rootEventAggregator.PublishAsync(new Event1 { Message = message1 });\nawait rootEventAggregator.PublishAsync(new Event2 { Payload = payload2 });\n```\n\n## Interface subscriber\n\n```C#\npublic interface IAsyncSubscriber\u003cin TEvent\u003e where TEvent : IEvent\n{\n    Task HandleAsync(TEvent @event, CancellationToken cancellationToken = default);\n}\n\npublic interface ISubscriber\u003cin TEvent\u003e where TEvent : IEvent\n{\n    void Handle(TEvent @event);\n}\n```\n\n## Delegate subscriber\n\n```C#\npublic static IServiceCollection SubscribeAsync\u003cTEvent\u003e(this IServiceCollection services,\n    Func\u003cTEvent, IServiceProvider, CancellationToken, Task\u003e handler,\n    SubscriberLifetime lifetime = SubscriberLifetime.Scoped);\n\npublic static IServiceCollection SubscribeAsync\u003cTEvent\u003e(this IServiceCollection services,\n    Func\u003cTEvent, IServiceProvider, Task\u003e handler,\n    SubscriberLifetime lifetime = SubscriberLifetime.Scoped);\n\npublic static IServiceCollection Subscribe\u003cTEvent\u003e(this IServiceCollection services,\n    Action\u003cTEvent, IServiceProvider\u003e handler,\n    SubscriberLifetime lifetime = SubscriberLifetime.Scoped);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetlah%2Fevent-aggregator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnetlah%2Fevent-aggregator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnetlah%2Fevent-aggregator/lists"}