Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Do not require non-public license classes to be registered; fixes #1127
  • Loading branch information
jbogard committed Jul 23, 2025
commit 3326813da9297cbee0f6b9e0f9dac2a7c7058007
1 change: 1 addition & 0 deletions MediatR.sln
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
Push.ps1 = Push.ps1
README.md = README.md
.github\workflows\release.yml = .github\workflows\release.yml
MediatR.snk = MediatR.snk
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediatR.Benchmarks", "test\MediatR.Benchmarks\MediatR.Benchmarks.csproj", "{1FA62162-F8F1-4CAD-B08E-8DCA603395AD}"
Expand Down
6 changes: 6 additions & 0 deletions src/MediatR/MediatR.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@
<None Include="..\..\LICENSE.md" Pack="true" PackagePath=""/>
<None Include="..\..\README.md" Pack="true" PackagePath="\" />
</ItemGroup>

<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
<_Parameter1>MediatR.Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010091986edd141861f402457659cb82b56cf6a0d60b3bd2e5aa4ea73d88afa929d278462d6c4c0e2ecbce21948c15514a310a82e6b2e6beaab6cb14230a03bc026609be59f938423f2490fa0033ae87a982fb4950db77d1a4635e14f7727161e93e5511de766ed8e515efd801464b7820a27fca30a32161485824e442cc5ffecfbe</_Parameter1>
</AssemblyAttribute>
</ItemGroup>

<ItemGroup>
<PackageReference Include="IsExternalInit" Version="1.0.3">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,13 @@ internal static void CheckLicense(this IServiceProvider serviceProvider)
{
if (LicenseChecked == false)
{
var licenseAccessor = serviceProvider.GetRequiredService<LicenseAccessor>();
var licenseValidator = serviceProvider.GetRequiredService<LicenseValidator>();
var licenseAccessor = serviceProvider.GetService<LicenseAccessor>() ?? new LicenseAccessor(
serviceProvider.GetRequiredService<MediatRServiceConfiguration>(),
serviceProvider.GetRequiredService<ILoggerFactory>()
);
var licenseValidator = serviceProvider.GetService<LicenseValidator>()
?? new LicenseValidator(serviceProvider.GetRequiredService<ILoggerFactory>());

var license = licenseAccessor.Current;
licenseValidator.Validate(license);
}
Expand Down
2 changes: 2 additions & 0 deletions src/MediatR/Registration/ServiceRegistrar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,8 @@ public static void AddRequiredServices(IServiceCollection services, MediatRServi
services.TryAdd(new ServiceDescriptor(typeof(IMediator), serviceConfiguration.MediatorImplementationType, serviceConfiguration.Lifetime));
services.TryAdd(new ServiceDescriptor(typeof(ISender), sp => sp.GetRequiredService<IMediator>(), serviceConfiguration.Lifetime));
services.TryAdd(new ServiceDescriptor(typeof(IPublisher), sp => sp.GetRequiredService<IMediator>(), serviceConfiguration.Lifetime));

ServiceCollectionExtensions.LicenseChecked = false;

services.TryAddSingleton(serviceConfiguration);
services.TryAddSingleton<LicenseAccessor>();
Expand Down
2 changes: 2 additions & 0 deletions test/MediatR.Tests/MediatR.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<Nullable>enable</Nullable>
<NoWarn>$(NoWarn);CS8002;</NoWarn>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\..\MediatR.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>

<ItemGroup>
Expand Down
7 changes: 7 additions & 0 deletions test/MediatR.Tests/MicrosoftExtensionsDI/PipelineTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,7 @@ public async Task Should_wrap_with_behavior()
var output = new Logger();
IServiceCollection services = new ServiceCollection();
services.AddSingleton(output);
services.AddFakeLogging();
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(Ping).Assembly);
Expand Down Expand Up @@ -425,6 +426,7 @@ public async Task Should_wrap_generics_with_behavior()
var output = new Logger();
IServiceCollection services = new ServiceCollection();
services.AddSingleton(output);
services.AddFakeLogging();
services.AddMediatR(cfg =>
{
// Call these registration methods multiple times to prove we don't register a service if it is already registered
Expand Down Expand Up @@ -459,6 +461,7 @@ public async Task Should_register_pre_and_post_processors()
var output = new Logger();
IServiceCollection services = new ServiceCollection();
services.AddSingleton(output);
services.AddFakeLogging();
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(Ping).Assembly);
Expand Down Expand Up @@ -498,6 +501,7 @@ public async Task Should_pick_up_specific_exception_behaviors()
{
var output = new Logger();
IServiceCollection services = new ServiceCollection();
services.AddFakeLogging();
services.AddSingleton(output);
services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Ping).Assembly));
var provider = services.BuildServiceProvider();
Expand Down Expand Up @@ -534,6 +538,7 @@ public void Should_handle_exceptions_from_behaviors()
var output = new Logger();
IServiceCollection services = new ServiceCollection();
services.AddSingleton(output);
services.AddFakeLogging();
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(Ping).Assembly);
Expand All @@ -554,6 +559,7 @@ public void Should_pick_up_exception_actions()
{
var output = new Logger();
IServiceCollection services = new ServiceCollection();
services.AddFakeLogging();
services.AddSingleton(output);
services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Ping).Assembly));
var provider = services.BuildServiceProvider();
Expand All @@ -572,6 +578,7 @@ public async Task Should_handle_constrained_generics()
var output = new Logger();
IServiceCollection services = new ServiceCollection();
services.AddSingleton(output);
services.AddFakeLogging();
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(Ping).Assembly);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public async Task Should_wrap_with_behavior()
{
var output = new Logger();
IServiceCollection services = new ServiceCollection();
services.AddFakeLogging();
services.AddSingleton(output);
services.AddTransient<IStreamPipelineBehavior<StreamPing, Pong>, OuterBehavior>();
services.AddTransient<IStreamPipelineBehavior<StreamPing, Pong>, InnerBehavior>();
Expand Down
1 change: 1 addition & 0 deletions test/MediatR.Tests/NotificationPublisherTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ public async Task Should_handle_sequentially_by_default()
var sequentialElapsed = timer.ElapsedMilliseconds;

services = new ServiceCollection();
services.AddFakeLogging();
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssemblyContaining<Notification>();
Expand Down
2 changes: 2 additions & 0 deletions test/MediatR.Tests/SendTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ public async Task Should_resolve_closed_handler_if_defined()
var dependency = new Dependency();
var services = new ServiceCollection();
services.AddSingleton(dependency);
services.AddFakeLogging();
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssemblies(Assembly.GetExecutingAssembly());
Expand All @@ -327,6 +328,7 @@ public async Task Should_resolve_open_handler_if_not_defined()
{
var dependency = new Dependency();
var services = new ServiceCollection();
services.AddFakeLogging();
services.AddSingleton(dependency);
services.AddMediatR(cfg =>
{
Expand Down
31 changes: 31 additions & 0 deletions test/MediatR.Tests/ServiceFactoryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ public class Pong
[Fact]
public async Task Should_throw_given_no_handler()
{
ServiceCollectionExtensions.LicenseChecked = false;

var serviceCollection = new ServiceCollection();
ServiceRegistrar.AddRequiredServices(serviceCollection, new MediatRServiceConfiguration());
serviceCollection.AddFakeLogging();
Expand All @@ -36,4 +38,33 @@ await Assert.ThrowsAsync<InvalidOperationException>(
() => mediator.Send(new Ping())
);
}

[Fact]
public void Should_not_throw_with_manual_registration()
{
ServiceCollectionExtensions.LicenseChecked = false;

var services = new ServiceCollection();
services.AddFakeLogging();
services.AddTransient<IMediator, Mediator>();
services.AddSingleton(new MediatRServiceConfiguration());

var container = services.BuildServiceProvider();

Should.NotThrow(() => container.GetRequiredService<IMediator>());
}

[Fact]
public void Should_throw_when_missing_required_configuration()
{
ServiceCollectionExtensions.LicenseChecked = false;

var services = new ServiceCollection();
services.AddFakeLogging();
services.AddTransient<IMediator, Mediator>();

var container = services.BuildServiceProvider();

Should.Throw<InvalidOperationException>(() => container.GetRequiredService<IMediator>());
}
}
Loading