PrimusSaaS.Notifications
1.0.0
See the version list below for details.
dotnet add package PrimusSaaS.Notifications --version 1.0.0
NuGet\Install-Package PrimusSaaS.Notifications -Version 1.0.0
<PackageReference Include="PrimusSaaS.Notifications" Version="1.0.0" />
<PackageVersion Include="PrimusSaaS.Notifications" Version="1.0.0" />
<PackageReference Include="PrimusSaaS.Notifications" />
paket add PrimusSaaS.Notifications --version 1.0.0
#r "nuget: PrimusSaaS.Notifications, 1.0.0"
#:package PrimusSaaS.Notifications@1.0.0
#addin nuget:?package=PrimusSaaS.Notifications&version=1.0.0
#tool nuget:?package=PrimusSaaS.Notifications&version=1.0.0
Primus.Notifications
Production-ready notification building blocks for Primus SaaS applications. The library provides SMTP email delivery, file-based templating with Fluid, an in-memory queue with a background worker, and instrumentation hooks for observability.
Features
- SMTP email channel with retry/backoff and structured logging
- File-based Liquid templates with caching and subject/body conventions
- In-memory bounded queue plus background worker for async delivery
- Lightweight diagnostics via
NotificationMetricsandNotificationRuntimeStats - Opt-in logger channel for non-email scenarios or local development
Installation
dotnet add package Primus.Notifications --version 1.0.0
Quick start (ASP.NET Core)
builder.Services.AddPrimusNotifications(notifications =>
{
notifications
.UseSmtp(opts =>
{
opts.Host = builder.Configuration["Smtp:Host"];
opts.Port = 587;
opts.Username = builder.Configuration["Smtp:Username"];
opts.Password = builder.Configuration["Smtp:Password"];
opts.FromAddress = "no-reply@primus.local";
opts.FromName = "Primus Notifications";
opts.EnableSsl = true;
})
.UseFileTemplates(Path.Combine(builder.Environment.ContentRootPath, "NotificationTemplates"))
.UseInMemoryQueue(options =>
{
options.BoundedCapacity = 500;
options.MaxParallelHandlers = 2;
})
.UseLogger();
});
Create a notification type:
public record WelcomeNotification(string Email, string Name) : INotification
{
public string Type => "Welcome";
public object Data => new { Name };
public IEnumerable<string> Channels => new[] { "Email", "Logger" };
public Recipient Recipient => new() { Email = Email, Name = Name };
}
Render templates from NotificationTemplates/Welcome/EmailSubject.liquid and NotificationTemplates/Welcome/EmailBody.liquid, then enqueue or send directly:
var notification = new WelcomeNotification("ada@example.com", "Ada");
// Async queue (recommended)
await queue.EnqueueAsync(notification, cancellationToken);
// Or immediate dispatch
await notificationService.SendAsync(notification, cancellationToken);
SMTP configuration
SmtpOptions supports host, port, credentials, SSL, sender info, timeout, retry count, and exponential backoff base delay. Validation runs during DI configuration to catch missing host/port/from settings early.
Templates
- File layout:
{BasePath}/{NotificationType}/EmailSubject.liquidandEmailBody.liquid - Fluid syntax with anonymous/POCO models
- Templates are cached after first parse for performance
- See
TEMPLATE_GUIDE.mdfor conventions and examples
Background processing
Calling .UseInMemoryQueue() registers InMemoryNotificationQueue and NotificationBackgroundService to drain the queue using scoped NotificationService instances. Configure capacity, max parallel handlers, and retry/backoff per NotificationQueueOptions.
Diagnostics
Expose metrics via NotificationMetrics (System.Diagnostics.Metrics instruments) and quick in-process stats via NotificationRuntimeStats.GetSnapshot().
Building and packing
dotnet test sdk/dotnet/Primus.Notifications.Tests/Primus.Notifications.Tests.csproj
dotnet pack sdk/dotnet/Primus.Notifications/Primus.Notifications.csproj -c Release
Packages are emitted to nupkg/ with symbols and README included.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net7.0 is compatible. 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. |
-
net7.0
- Fluid.Core (>= 2.5.0)
- MailKit (>= 4.3.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 7.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 7.0.0)
- Microsoft.Extensions.Logging.Abstractions (>= 7.0.0)
- Microsoft.Extensions.Options.ConfigurationExtensions (>= 7.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.
Initial production release with SMTP channel, file-based templating, in-memory queue, background dispatch workers, and metrics hooks.