Skip to content

Commit 1071472

Browse files
authored
Merge pull request #1129 from LuckyPennySoftware/1127-do-not-require-internal-license-checkers-to-be-registered-in-the-container
Do not require non-public license classes to be registered; fixes #1127
2 parents 8991661 + 5a31dc5 commit 1071472

23 files changed

+299
-314
lines changed

MediatR.sln

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
2121
Push.ps1 = Push.ps1
2222
README.md = README.md
2323
.github\workflows\release.yml = .github\workflows\release.yml
24+
MediatR.snk = MediatR.snk
2425
EndProjectSection
2526
EndProject
2627
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MediatR.Benchmarks", "test\MediatR.Benchmarks\MediatR.Benchmarks.csproj", "{1FA62162-F8F1-4CAD-B08E-8DCA603395AD}"

src/MediatR/MediatR.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@
3030
<None Include="..\..\LICENSE.md" Pack="true" PackagePath=""/>
3131
<None Include="..\..\README.md" Pack="true" PackagePath="\" />
3232
</ItemGroup>
33+
34+
<ItemGroup>
35+
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
36+
<_Parameter1>MediatR.Tests, PublicKey=002400000480000094000000060200000024000052534131000400000100010091986edd141861f402457659cb82b56cf6a0d60b3bd2e5aa4ea73d88afa929d278462d6c4c0e2ecbce21948c15514a310a82e6b2e6beaab6cb14230a03bc026609be59f938423f2490fa0033ae87a982fb4950db77d1a4635e14f7727161e93e5511de766ed8e515efd801464b7820a27fca30a32161485824e442cc5ffecfbe</_Parameter1>
37+
</AssemblyAttribute>
38+
</ItemGroup>
3339

3440
<ItemGroup>
3541
<PackageReference Include="IsExternalInit" Version="1.0.3">

src/MediatR/MicrosoftExtensionsDI/ServiceCollectionExtensions.cs renamed to src/MediatR/MicrosoftExtensionsDI/MediatRServiceCollectionExtensions.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ namespace Microsoft.Extensions.DependencyInjection;
1818
/// This does not scan for any <see cref="IPipelineBehavior{TRequest,TResponse}"/> instances including <see cref="RequestPreProcessorBehavior{TRequest,TResponse}"/> and <see cref="RequestPreProcessorBehavior{TRequest,TResponse}"/>.
1919
/// To register behaviors, use the <see cref="ServiceCollectionServiceExtensions.AddTransient(IServiceCollection,Type,Type)"/> with the open generic or closed generic types.
2020
/// </summary>
21-
public static class ServiceCollectionExtensions
21+
public static class MediatRServiceCollectionExtensions
2222
{
2323
/// <summary>
2424
/// Registers handlers and mediator types from the specified assemblies
@@ -63,8 +63,13 @@ internal static void CheckLicense(this IServiceProvider serviceProvider)
6363
{
6464
if (LicenseChecked == false)
6565
{
66-
var licenseAccessor = serviceProvider.GetRequiredService<LicenseAccessor>();
67-
var licenseValidator = serviceProvider.GetRequiredService<LicenseValidator>();
66+
var licenseAccessor = serviceProvider.GetService<LicenseAccessor>() ?? new LicenseAccessor(
67+
serviceProvider.GetRequiredService<MediatRServiceConfiguration>(),
68+
serviceProvider.GetRequiredService<ILoggerFactory>()
69+
);
70+
var licenseValidator = serviceProvider.GetService<LicenseValidator>()
71+
?? new LicenseValidator(serviceProvider.GetRequiredService<ILoggerFactory>());
72+
6873
var license = licenseAccessor.Current;
6974
licenseValidator.Validate(license);
7075
}

src/MediatR/Registration/ServiceRegistrar.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,8 @@ public static void AddRequiredServices(IServiceCollection services, MediatRServi
391391
services.TryAdd(new ServiceDescriptor(typeof(IMediator), serviceConfiguration.MediatorImplementationType, serviceConfiguration.Lifetime));
392392
services.TryAdd(new ServiceDescriptor(typeof(ISender), sp => sp.GetRequiredService<IMediator>(), serviceConfiguration.Lifetime));
393393
services.TryAdd(new ServiceDescriptor(typeof(IPublisher), sp => sp.GetRequiredService<IMediator>(), serviceConfiguration.Lifetime));
394+
395+
MediatRServiceCollectionExtensions.LicenseChecked = false;
394396

395397
services.TryAddSingleton(serviceConfiguration);
396398
services.TryAddSingleton<LicenseAccessor>();

test/MediatR.Tests/CreateStreamTests.cs

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ namespace MediatR.Tests;
77
using System.Runtime.CompilerServices;
88
using System.Threading.Tasks;
99
using Shouldly;
10-
using Lamar;
1110
using Xunit;
1211

1312
public class CreateStreamTests
@@ -38,15 +37,13 @@ public async Task Should_resolve_main_handler()
3837
{
3938
cfg.Scan(scanner =>
4039
{
41-
scanner.AssemblyContainingType(typeof(CreateStreamTests));
42-
scanner.IncludeNamespaceContainingType<Ping>();
43-
scanner.WithDefaultConventions();
44-
scanner.AddAllTypesOf(typeof(IStreamRequestHandler<,>));
40+
scanner.FromAssemblyOf<CreateStreamTests>()
41+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IStreamRequestHandler<,>))).AsImplementedInterfaces();
4542
});
46-
cfg.For<IMediator>().Use<Mediator>();
43+
cfg.AddTransient<IMediator, Mediator>();
4744
});
4845

49-
var mediator = container.GetInstance<IMediator>();
46+
var mediator = container.GetRequiredService<IMediator>();
5047

5148
var response = mediator.CreateStream(new Ping { Message = "Ping" });
5249
int i = 0;
@@ -70,15 +67,13 @@ public async Task Should_resolve_main_handler_via_dynamic_dispatch()
7067
{
7168
cfg.Scan(scanner =>
7269
{
73-
scanner.AssemblyContainingType(typeof(CreateStreamTests));
74-
scanner.IncludeNamespaceContainingType<Ping>();
75-
scanner.WithDefaultConventions();
76-
scanner.AddAllTypesOf(typeof(IStreamRequestHandler<,>));
70+
scanner.FromAssemblyOf<CreateStreamTests>()
71+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IStreamRequestHandler<,>))).AsImplementedInterfaces();
7772
});
78-
cfg.For<IMediator>().Use<Mediator>();
73+
cfg.AddTransient<IMediator, Mediator>();
7974
});
8075

81-
var mediator = container.GetInstance<IMediator>();
76+
var mediator = container.GetRequiredService<IMediator>();
8277

8378
object request = new Ping { Message = "Ping" };
8479
var response = mediator.CreateStream(request);
@@ -103,15 +98,13 @@ public async Task Should_resolve_main_handler_by_specific_interface()
10398
{
10499
cfg.Scan(scanner =>
105100
{
106-
scanner.AssemblyContainingType(typeof(CreateStreamTests));
107-
scanner.IncludeNamespaceContainingType<Ping>();
108-
scanner.WithDefaultConventions();
109-
scanner.AddAllTypesOf(typeof(IStreamRequestHandler<,>));
101+
scanner.FromAssemblyOf<CreateStreamTests>()
102+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IStreamRequestHandler<,>))).AsImplementedInterfaces();
110103
});
111-
cfg.For<ISender>().Use<Mediator>();
104+
cfg.AddTransient<ISender, Mediator>();
112105
});
113106

114-
var mediator = container.GetInstance<ISender>();
107+
var mediator = container.GetRequiredService<ISender>();
115108
var response = mediator.CreateStream(new Ping { Message = "Ping" });
116109
int i = 0;
117110
await foreach (Pong result in response)
@@ -132,10 +125,10 @@ public void Should_raise_execption_on_null_request()
132125
{
133126
var container = TestContainer.Create(cfg =>
134127
{
135-
cfg.For<IMediator>().Use<Mediator>();
128+
cfg.AddTransient<IMediator, Mediator>();
136129
});
137130

138-
var mediator = container.GetInstance<IMediator>();
131+
var mediator = container.GetRequiredService<IMediator>();
139132

140133
Should.Throw<ArgumentNullException>(() => mediator.CreateStream((Ping) null!));
141134
}
@@ -145,10 +138,10 @@ public void Should_raise_execption_on_null_request_via_dynamic_dispatch()
145138
{
146139
var container = TestContainer.Create(cfg =>
147140
{
148-
cfg.For<IMediator>().Use<Mediator>();
141+
cfg.AddTransient<IMediator, Mediator>();
149142
});
150143

151-
var mediator = container.GetInstance<IMediator>();
144+
var mediator = container.GetRequiredService<IMediator>();
152145

153146
Should.Throw<ArgumentNullException>(() => mediator.CreateStream((object) null!));
154147
}

test/MediatR.Tests/ExceptionTests.cs

Lines changed: 40 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@ namespace MediatR.Tests;
55
using System;
66
using System.Threading.Tasks;
77
using Shouldly;
8-
using Lamar;
98
using Xunit;
10-
using Lamar.IoC;
119

1210
public class ExceptionTests
1311
{
@@ -73,21 +71,21 @@ public ExceptionTests()
7371
{
7472
var container = TestContainer.Create(cfg =>
7573
{
76-
cfg.For<IMediator>().Use<Mediator>();
74+
cfg.AddTransient<IMediator, Mediator>();
7775
});
78-
_mediator = container.GetInstance<IMediator>();
76+
_mediator = container.GetRequiredService<IMediator>();
7977
}
8078

8179
[Fact]
8280
public async Task Should_throw_for_send()
8381
{
84-
await Should.ThrowAsync<LamarMissingRegistrationException>(async () => await _mediator.Send(new Ping()));
82+
await Should.ThrowAsync<InvalidOperationException>(async () => await _mediator.Send(new Ping()));
8583
}
8684

8785
[Fact]
8886
public async Task Should_throw_for_void_send()
8987
{
90-
await Should.ThrowAsync<LamarMissingRegistrationException>(async () => await _mediator.Send(new VoidPing()));
88+
await Should.ThrowAsync<InvalidOperationException>(async () => await _mediator.Send(new VoidPing()));
9189
}
9290

9391
[Fact]
@@ -108,13 +106,13 @@ public async Task Should_not_throw_for_publish()
108106
[Fact]
109107
public async Task Should_throw_for_async_send()
110108
{
111-
await Should.ThrowAsync<LamarMissingRegistrationException>(async () => await _mediator.Send(new AsyncPing()));
109+
await Should.ThrowAsync<InvalidOperationException>(async () => await _mediator.Send(new AsyncPing()));
112110
}
113111

114112
[Fact]
115113
public async Task Should_throw_for_async_void_send()
116114
{
117-
await Should.ThrowAsync<LamarMissingRegistrationException>(async () => await _mediator.Send(new AsyncVoidPing()));
115+
await Should.ThrowAsync<InvalidOperationException>(async () => await _mediator.Send(new AsyncVoidPing()));
118116
}
119117

120118
[Fact]
@@ -139,14 +137,12 @@ public async Task Should_throw_argument_exception_for_send_when_request_is_null(
139137
{
140138
cfg.Scan(scanner =>
141139
{
142-
scanner.AssemblyContainingType(typeof(NullPing));
143-
scanner.IncludeNamespaceContainingType<Ping>();
144-
scanner.WithDefaultConventions();
145-
scanner.AddAllTypesOf(typeof(IRequestHandler<,>));
140+
scanner.FromAssemblyOf<NullPing>()
141+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<,>))).AsImplementedInterfaces();
146142
});
147-
cfg.For<IMediator>().Use<Mediator>();
143+
cfg.AddTransient<IMediator, Mediator>();
148144
});
149-
var mediator = container.GetInstance<IMediator>();
145+
var mediator = container.GetRequiredService<IMediator>();
150146

151147
NullPing request = null!;
152148

@@ -160,14 +156,12 @@ public async Task Should_throw_argument_exception_for_void_send_when_request_is_
160156
{
161157
cfg.Scan(scanner =>
162158
{
163-
scanner.AssemblyContainingType(typeof(VoidNullPing));
164-
scanner.IncludeNamespaceContainingType<Ping>();
165-
scanner.WithDefaultConventions();
166-
scanner.AddAllTypesOf(typeof(IRequestHandler<,>));
159+
scanner.FromAssemblyOf<VoidNullPing>()
160+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<,>))).AsImplementedInterfaces();
167161
});
168-
cfg.For<IMediator>().Use<Mediator>();
162+
cfg.AddTransient<IMediator, Mediator>();
169163
});
170-
var mediator = container.GetInstance<IMediator>();
164+
var mediator = container.GetRequiredService<IMediator>();
171165

172166
VoidNullPing request = null!;
173167

@@ -181,14 +175,12 @@ public async Task Should_throw_argument_exception_for_publish_when_request_is_nu
181175
{
182176
cfg.Scan(scanner =>
183177
{
184-
scanner.AssemblyContainingType(typeof(NullPinged));
185-
scanner.IncludeNamespaceContainingType<Ping>();
186-
scanner.WithDefaultConventions();
187-
scanner.AddAllTypesOf(typeof(IRequestHandler<,>));
178+
scanner.FromAssemblyOf<NullPinged>()
179+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<,>))).AsImplementedInterfaces();
188180
});
189-
cfg.For<IMediator>().Use<Mediator>();
181+
cfg.AddTransient<IMediator, Mediator>();
190182
});
191-
var mediator = container.GetInstance<IMediator>();
183+
var mediator = container.GetRequiredService<IMediator>();
192184

193185
NullPinged notification = null!;
194186

@@ -202,14 +194,12 @@ public async Task Should_throw_argument_exception_for_publish_when_request_is_nu
202194
{
203195
cfg.Scan(scanner =>
204196
{
205-
scanner.AssemblyContainingType(typeof(NullPinged));
206-
scanner.IncludeNamespaceContainingType<Ping>();
207-
scanner.WithDefaultConventions();
208-
scanner.AddAllTypesOf(typeof(IRequestHandler<,>));
197+
scanner.FromAssemblyOf<NullPinged>()
198+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<,>))).AsImplementedInterfaces();
209199
});
210-
cfg.For<IMediator>().Use<Mediator>();
200+
cfg.AddTransient<IMediator, Mediator>();
211201
});
212-
var mediator = container.GetInstance<IMediator>();
202+
var mediator = container.GetRequiredService<IMediator>();
213203

214204
object notification = null!;
215205

@@ -223,14 +213,12 @@ public async Task Should_throw_argument_exception_for_publish_when_request_is_no
223213
{
224214
cfg.Scan(scanner =>
225215
{
226-
scanner.AssemblyContainingType(typeof(NullPinged));
227-
scanner.IncludeNamespaceContainingType<Ping>();
228-
scanner.WithDefaultConventions();
229-
scanner.AddAllTypesOf(typeof(IRequestHandler<,>));
216+
scanner.FromAssemblyOf<NullPinged>()
217+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<,>))).AsImplementedInterfaces();
230218
});
231-
cfg.For<IMediator>().Use<Mediator>();
219+
cfg.AddTransient<IMediator, Mediator>();
232220
});
233-
var mediator = container.GetInstance<IMediator>();
221+
var mediator = container.GetRequiredService<IMediator>();
234222

235223
object notification = "totally not notification";
236224

@@ -257,15 +245,13 @@ public async Task Should_throw_exception_for_non_generic_send_when_exception_occ
257245
{
258246
cfg.Scan(scanner =>
259247
{
260-
scanner.AssemblyContainingType(typeof(NullPinged));
261-
scanner.IncludeNamespaceContainingType<Ping>();
262-
scanner.WithDefaultConventions();
263-
scanner.AddAllTypesOf(typeof(IRequestHandler<,>));
264-
scanner.AddAllTypesOf(typeof(IRequestHandler<>));
248+
scanner.FromAssemblyOf<NullPinged>()
249+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<,>))).AsImplementedInterfaces()
250+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<>))).AsImplementedInterfaces();
265251
});
266-
cfg.For<IMediator>().Use<Mediator>();
252+
cfg.AddTransient<IMediator, Mediator>();
267253
});
268-
var mediator = container.GetInstance<IMediator>();
254+
var mediator = container.GetRequiredService<IMediator>();
269255

270256
object pingException = new PingException();
271257

@@ -279,14 +265,12 @@ public async Task Should_throw_exception_for_non_request_send()
279265
{
280266
cfg.Scan(scanner =>
281267
{
282-
scanner.AssemblyContainingType(typeof(NullPinged));
283-
scanner.IncludeNamespaceContainingType<Ping>();
284-
scanner.WithDefaultConventions();
285-
scanner.AddAllTypesOf(typeof(IRequestHandler<,>));
268+
scanner.FromAssemblyOf<NullPinged>()
269+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<,>))).AsImplementedInterfaces();
286270
});
287-
cfg.For<IMediator>().Use<Mediator>();
271+
cfg.AddTransient<IMediator, Mediator>();
288272
});
289-
var mediator = container.GetInstance<IMediator>();
273+
var mediator = container.GetRequiredService<IMediator>();
290274

291275
object nonRequest = new NonRequest();
292276

@@ -306,15 +290,13 @@ public async Task Should_throw_exception_for_generic_send_when_exception_occurs(
306290
{
307291
cfg.Scan(scanner =>
308292
{
309-
scanner.AssemblyContainingType(typeof(NullPinged));
310-
scanner.IncludeNamespaceContainingType<Ping>();
311-
scanner.WithDefaultConventions();
312-
scanner.AddAllTypesOf(typeof(IRequestHandler<,>));
313-
scanner.AddAllTypesOf(typeof(IRequestHandler<>));
293+
scanner.FromAssemblyOf<NullPinged>()
294+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<,>))).AsImplementedInterfaces()
295+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<>))).AsImplementedInterfaces();
314296
});
315-
cfg.For<IMediator>().Use<Mediator>();
297+
cfg.AddTransient<IMediator, Mediator>();
316298
});
317-
var mediator = container.GetInstance<IMediator>();
299+
var mediator = container.GetRequiredService<IMediator>();
318300

319301
PingException pingException = new PingException();
320302

test/MediatR.Tests/GenericTypeConstraintsTests.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ namespace MediatR.Tests;
66
using System;
77
using System.Linq;
88
using Shouldly;
9-
using Lamar;
109
using System.Threading.Tasks;
1110
using Xunit;
1211

@@ -93,17 +92,14 @@ public GenericTypeConstraintsTests()
9392
{
9493
cfg.Scan(scanner =>
9594
{
96-
scanner.AssemblyContainingType(typeof(GenericTypeConstraintsTests));
97-
scanner.IncludeNamespaceContainingType<Ping>();
98-
scanner.IncludeNamespaceContainingType<Jing>();
99-
scanner.WithDefaultConventions();
100-
scanner.AddAllTypesOf(typeof(IRequestHandler<,>));
101-
scanner.AddAllTypesOf(typeof(IRequestHandler<>));
95+
scanner.FromAssemblyOf<GenericTypeConstraintsTests>()
96+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<,>))).AsImplementedInterfaces()
97+
.AddClasses(t => t.InNamespaceOf<Ping>().AssignableTo(typeof(IRequestHandler<>))).AsImplementedInterfaces();
10298
});
103-
cfg.For<IMediator>().Use<Mediator>();
99+
cfg.AddTransient<IMediator, Mediator>();
104100
});
105101

106-
_mediator = container.GetInstance<IMediator>();
102+
_mediator = container.GetRequiredService<IMediator>();
107103
}
108104

109105
[Fact]

0 commit comments

Comments
 (0)