Workleap.Extensions.MediatR.ApplicationInsights
1.1.4-preview.1
Prefix Reserved
See the version list below for details.
dotnet add package Workleap.Extensions.MediatR.ApplicationInsights --version 1.1.4-preview.1
NuGet\Install-Package Workleap.Extensions.MediatR.ApplicationInsights -Version 1.1.4-preview.1
<PackageReference Include="Workleap.Extensions.MediatR.ApplicationInsights" Version="1.1.4-preview.1" />
paket add Workleap.Extensions.MediatR.ApplicationInsights --version 1.1.4-preview.1
#r "nuget: Workleap.Extensions.MediatR.ApplicationInsights, 1.1.4-preview.1"
// Install Workleap.Extensions.MediatR.ApplicationInsights as a Cake Addin #addin nuget:?package=Workleap.Extensions.MediatR.ApplicationInsights&version=1.1.4-preview.1&prerelease // Install Workleap.Extensions.MediatR.ApplicationInsights as a Cake Tool #tool nuget:?package=Workleap.Extensions.MediatR.ApplicationInsights&version=1.1.4-preview.1&prerelease
Workleap.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, Workleap. 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
- Microsoft.ApplicationInsights (>= 2.21.0)
- Microsoft.Bcl.AsyncInterfaces (>= 6.0.0)
- Workleap.Extensions.MediatR (>= 1.1.4-preview.1)
-
net6.0
- Microsoft.ApplicationInsights (>= 2.21.0)
- Workleap.Extensions.MediatR (>= 1.1.4-preview.1)
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.4.2-preview.13 | 22 | 11/29/2024 |
1.4.2-preview.12 | 31 | 11/24/2024 |
1.4.2-preview.11 | 36 | 11/16/2024 |
1.4.2-preview.10 | 40 | 10/31/2024 |
1.4.2-preview.9 | 37 | 10/30/2024 |
1.4.2-preview.8 | 40 | 10/28/2024 |
1.4.2-preview.7 | 40 | 10/28/2024 |
1.4.2-preview.6 | 38 | 10/28/2024 |
1.4.2-preview.5 | 46 | 10/7/2024 |
1.4.2-preview.4 | 53 | 10/1/2024 |
1.4.2-preview.3 | 47 | 10/1/2024 |
1.4.2-preview.1 | 52 | 9/27/2024 |
1.4.1 | 1,581 | 9/20/2024 |
1.4.1-preview.10 | 39 | 9/20/2024 |
1.4.1-preview.9 | 48 | 9/20/2024 |
1.4.1-preview.8 | 47 | 9/20/2024 |
1.4.1-preview.7 | 52 | 9/13/2024 |
1.4.1-preview.6 | 51 | 8/28/2024 |
1.4.1-preview.5 | 45 | 8/27/2024 |
1.4.1-preview.4 | 47 | 8/27/2024 |
1.4.1-preview.3 | 45 | 8/27/2024 |
1.4.1-preview.2 | 67 | 8/16/2024 |
1.4.1-preview.1 | 71 | 8/16/2024 |
1.4.0 | 1,527 | 7/31/2024 |
1.3.1-preview.20 | 33 | 7/31/2024 |
1.3.1-preview.19 | 60 | 7/15/2024 |
1.3.1-preview.18 | 41 | 7/5/2024 |
1.3.1-preview.17 | 62 | 6/10/2024 |
1.3.1-preview.16 | 58 | 5/31/2024 |
1.3.1-preview.15 | 54 | 5/31/2024 |
1.3.1-preview.14 | 53 | 5/28/2024 |
1.3.1-preview.13 | 56 | 5/21/2024 |
1.3.1-preview.12 | 67 | 5/10/2024 |
1.3.1-preview.11 | 73 | 4/12/2024 |
1.3.1-preview.10 | 68 | 4/3/2024 |
1.3.1-preview.9 | 59 | 4/3/2024 |
1.3.1-preview.8 | 63 | 3/8/2024 |
1.3.1-preview.7 | 60 | 3/7/2024 |
1.3.1-preview.6 | 57 | 3/4/2024 |
1.3.1-preview.5 | 69 | 3/1/2024 |
1.3.1-preview.4 | 71 | 2/16/2024 |
1.3.1-preview.3 | 66 | 2/12/2024 |
1.3.1-preview.2 | 65 | 2/6/2024 |
1.3.1-preview.1 | 70 | 2/6/2024 |
1.3.0 | 16,596 | 1/15/2024 |
1.2.1-preview.8 | 74 | 1/15/2024 |
1.2.1-preview.7 | 66 | 1/12/2024 |
1.2.1-preview.6 | 55 | 1/12/2024 |
1.2.1-preview.5 | 56 | 1/12/2024 |
1.2.1-preview.4 | 60 | 1/12/2024 |
1.2.1-preview.3 | 80 | 12/18/2023 |
1.2.1-preview.2 | 85 | 12/7/2023 |
1.2.1-preview.1 | 93 | 11/17/2023 |
1.2.0 | 8,905 | 11/15/2023 |
1.1.4-preview.14 | 66 | 11/14/2023 |
1.1.4-preview.13 | 68 | 11/13/2023 |
1.1.4-preview.12 | 70 | 11/13/2023 |
1.1.4-preview.11 | 84 | 11/6/2023 |
1.1.4-preview.10 | 81 | 10/30/2023 |
1.1.4-preview.9 | 84 | 10/20/2023 |
1.1.4-preview.8 | 78 | 10/17/2023 |
1.1.4-preview.7 | 90 | 10/13/2023 |
1.1.4-preview.6 | 75 | 9/26/2023 |
1.1.4-preview.5 | 83 | 9/25/2023 |
1.1.4-preview.4 | 72 | 9/21/2023 |
1.1.4-preview.3 | 69 | 9/20/2023 |
1.1.4-preview.2 | 69 | 9/20/2023 |
1.1.4-preview.1 | 67 | 9/20/2023 |
1.1.3 | 39,316 | 9/11/2023 |
1.1.3-preview.2 | 87 | 9/11/2023 |
1.1.3-preview.1 | 93 | 8/9/2023 |
1.1.2 | 197 | 7/20/2023 |
1.1.2-preview.7 | 97 | 7/20/2023 |