GSoft.Extensions.MediatR.ApplicationInsights
1.1.0
Prefix Reserved
See the version list below for details.
dotnet add package GSoft.Extensions.MediatR.ApplicationInsights --version 1.1.0
NuGet\Install-Package GSoft.Extensions.MediatR.ApplicationInsights -Version 1.1.0
<PackageReference Include="GSoft.Extensions.MediatR.ApplicationInsights" Version="1.1.0" />
paket add GSoft.Extensions.MediatR.ApplicationInsights --version 1.1.0
#r "nuget: GSoft.Extensions.MediatR.ApplicationInsights, 1.1.0"
// Install GSoft.Extensions.MediatR.ApplicationInsights as a Cake Addin #addin nuget:?package=GSoft.Extensions.MediatR.ApplicationInsights&version=1.1.0 // Install GSoft.Extensions.MediatR.ApplicationInsights as a Cake Tool #tool nuget:?package=GSoft.Extensions.MediatR.ApplicationInsights&version=1.1.0
GSoft.Extensions.MediatR
This library ensures that MediatR is registered in the dependency injection container as a singleton and also adds several features:
- Activity-based OpenTelemetry instrumentation
- High-performance logging with
Debug
log level - Data annotations support for request validation, similar to ASP.NET Core model validation
- Application Insights instrumentation (in a separate NuGet package)
- CQRS conventions and MediatR best practices with Roslyn analyzers
Getting started
Use the AddMediator(params Assembly[] assemblies)
extension method on your dependency injection services (IServiceCollection
) to automatically register all the MediatR request handlers from a given assembly.
builder.Services.AddMediator(typeof(Program).Assembly /*, [more assemblies...] */);
If you use Application Insights and want to instrument your handlers, you can install the dedicated NuGet package:
builder.Services.AddMediator(typeof(Program).Assembly).AddApplicationInsights();
There are multiple method overloads of AddMediator
. For instance, you can override MediatR configuration using this overload that accepts a Action<MediatRServiceConfiguration>
:
builder.Services.AddMediator(
cfg => cfg.NotificationPublisher = new TaskWhenAllPublisher(),
typeof(Program).Assembly);
Example
// CQRS naming conventions are suggested by a Roslyn analyzer, but it can be disabled
public sealed record SayHelloCommand([property: Required] string To) : IRequest;
public sealed class SayHelloCommandHandler : IRequestHandler<SayHelloCommand>
{
public Task Handle(SayHelloCommand command, CancellationToken cancellationToken)
{
Console.WriteLine($"Hello {command.To}!");
return Task.CompletedTask;
}
}
// [...] Retrieve an instance of IMediator or ISender
var mediator = serviceProvider.GetRequiredService<IMediator>();
// - We use the preferred Async-suffixed extension method to put emphasis on the asynchronous aspect of MediatR
// - A Roslyn analyzer suggests to specify a cancellation token, which is most of the time forgotten by developers
await mediator.SendAsync(new SayHelloCommand("world"), CancellationToken.None);
// This throws RequestValidationException because 'SayHelloCommand.To' is marked as required
await mediator.SendAsync(new SayHelloCommand(null!), CancellationToken.None);
Included Roslyn analyzers
Rule ID | Category | Severity | Description |
---|---|---|---|
GMDTR01 | Naming | Warning | Name should end with 'Command' or 'Query' |
GMDTR02 | Naming | Warning | Name should end with 'CommandHandler' or 'QueryHandler' |
GMDTR03 | Naming | Warning | Name should end with 'StreamQuery' |
GMDTR04 | Naming | Warning | Name should end with 'StreamQueryHandler' |
GMDTR05 | Naming | Warning | Name should end with 'Notification' or 'Event' |
GMDTR06 | Naming | Warning | Name should end with 'NotificationHandler' or 'EventHandler' |
GMDTR07 | Design | Warning | Use generic method instead |
GMDTR08 | Design | Warning | Provide a cancellation token |
GMDTR09 | Design | Warning | Handlers should not call other handlers |
GMDTR10 | Design | Warning | Handlers should not be public |
GMDTR11 | Design | Warning | Use 'AddMediator' extension method instead of 'AddMediatR' |
GMDTR12 | Design | Warning | Use method ending with 'Async' instead |
GMDTR13 | Naming | Warning | Name should end with 'Handler' |
In order to change the severity of one of these diagnostic rules, use a .editorconfig
file, for instance:
[*.cs]
dotnet_diagnostic.GMDTR01.severity = none
To learn more about how to configure or suppress code analysis warnings, read this documentation.
Building, releasing and versioning
The project can be built by running Build.ps1
. It uses Microsoft.CodeAnalysis.PublicApiAnalyzers to help detect public API breaking changes. Use the built-in roslyn analyzer to ensure that public APIs are declared in PublicAPI.Shipped.txt
, and obsolete public APIs in PublicAPI.Unshipped.txt
.
A new preview NuGet package is automatically published on any new commit on the main branch. This means that by completing a pull request, you automatically get a new NuGet package.
When you are ready to officially release a stable NuGet package by following the SemVer guidelines, simply manually create a tag with the format x.y.z
. This will automatically create and publish a NuGet package for this version.
License
Copyright © 2023, GSoft Group Inc. This code is licensed under the Apache License, Version 2.0. You may obtain a copy of this license at https://github.com/gsoft-inc/gsoft-license/blob/master/LICENSE.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. 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. |
.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. |
-
.NETStandard 2.0
- GSoft.Extensions.MediatR (>= 1.1.0)
- Microsoft.ApplicationInsights (>= 2.21.0)
- Microsoft.Bcl.AsyncInterfaces (>= 6.0.0)
-
net6.0
- GSoft.Extensions.MediatR (>= 1.1.0)
- Microsoft.ApplicationInsights (>= 2.21.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.