Nedo.AspNet.Notifications 1.0.0

dotnet add package Nedo.AspNet.Notifications --version 1.0.0
                    
NuGet\Install-Package Nedo.AspNet.Notifications -Version 1.0.0
                    
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="Nedo.AspNet.Notifications" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Nedo.AspNet.Notifications" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="Nedo.AspNet.Notifications" />
                    
Project file
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 Nedo.AspNet.Notifications --version 1.0.0
                    
#r "nuget: Nedo.AspNet.Notifications, 1.0.0"
                    
#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 Nedo.AspNet.Notifications@1.0.0
                    
#: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=Nedo.AspNet.Notifications&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=Nedo.AspNet.Notifications&version=1.0.0
                    
Install as a Cake Tool

Nedo.AspNet.Notifications

Store-and-forward notifications for ASP.NET Core: a message is persisted first, fanned out into one delivery row per device, and sent by a background dispatcher that retries with backoff. Nothing is sent inside the request that raised it, so a slow or unreachable transport cannot fail a user's action, and a restart resumes instead of losing the queue.

Package Take it when
Nedo.AspNet.Notifications.Abstractions your code RAISES notifications — contracts and models only, no transport, no database
Nedo.AspNet.Notifications you host the queue: entities, dispatcher, retry policy, device-token store, templates
Nedo.AspNet.Notifications.Firebase you deliver over Firebase Cloud Messaging

Install

dotnet add package Nedo.AspNet.Notifications
dotnet add package Nedo.AspNet.Notifications.Firebase   # transport

Wiring

The library never names your DbContext. Implement INotificationStore on the context that owns the three tables and register it:

public class AppDbContext : DbContext, INotificationStore
{
    public DbSet<NotificationMessage> NotificationMessages => Set<NotificationMessage>();
    public DbSet<NotificationDelivery> NotificationDeliveries => Set<NotificationDelivery>();
    public DbSet<UserDeviceToken> UserDeviceTokens => Set<UserDeviceToken>();
}

builder.Services.AddNedoNotifications<AppDbContext>(builder.Configuration);
builder.Services.AddFirebaseNotifications();

AddNedoNotifications reads its own Notifications configuration section — templates, whether the dispatcher runs in this process, batch size and backoff. Migrations are yours: the entities map through your context, so your application generates the DDL that matches your own naming.

Raising one

await dispatcher.QueueAsync(new NotificationRequest
{
    Type   = "invoice.issued",          // stable machine key; your own vocabulary
    UserId = user.Id,
    Title  = "Invoice issued",
    Body   = "Invoice #1042 is ready.",
    Data   = new Dictionary<string, string> { ["invoiceId"] = "1042" },
});

The dispatcher claims rows it is about to send, so several instances can run the queue without two of them sending the same delivery. A token the transport reports as dead is retired rather than retried; a transient failure backs off and is tried again.

Transports

INotificationSender is the seam. The Firebase package implements it over FirebaseAdmin and classifies FCM's answers — an unregistered token is a dead device, a quota or server error is transient. Credentials come from the host through IFirebaseCredentialSource, so this package never decides where your service-account key lives.

Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible.  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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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 136 9/24/2026