Skip to content

Commit fb30902

Browse files
authored
Merge pull request #1057 from zachpainter77/master
Make Auto Registration of Generic Handlers OPT-IN
2 parents cac76be + 32b512e commit fb30902

File tree

6 files changed

+30
-33
lines changed

6 files changed

+30
-33
lines changed

src/MediatR/MicrosoftExtensionsDI/MediatrServiceConfiguration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public class MediatRServiceConfiguration
9292
/// <summary>
9393
/// Flag that controlls whether MediatR will attempt to register handlers that containg generic type parameters.
9494
/// </summary>
95-
public bool RegisterGenericHandlers { get; set; } = true;
95+
public bool RegisterGenericHandlers { get; set; } = false;
9696

9797
/// <summary>
9898
/// Register various handlers from assembly containing given type

src/MediatR/Registration/ServiceRegistrar.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -228,10 +228,7 @@ private static (Type Service, Type Implementation) GetConcreteRegistrationTypes(
228228
var constraintsForEachParameter = openRequestHandlerImplementation
229229
.GetGenericArguments()
230230
.Select(x => x.GetGenericParameterConstraints())
231-
.ToList();
232-
233-
if (constraintsForEachParameter.Count > 2 && constraintsForEachParameter.Any(constraints => !constraints.Where(x => x.IsInterface || x.IsClass).Any()))
234-
throw new ArgumentException($"Error registering the generic handler type: {openRequestHandlerImplementation.FullName}. When registering generic requests with more than two type parameters, each type parameter must have at least one constraint of type interface or class.");
231+
.ToList();
235232

236233
var typesThatCanCloseForEachParameter = constraintsForEachParameter
237234
.Select(constraints => assembliesToScan

test/MediatR.Tests/GenericRequestHandlerTests.cs

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public void ShouldResolveAllCombinationsOfGenericHandler(int numberOfClasses, in
3232
services.AddMediatR(cfg =>
3333
{
3434
cfg.RegisterServicesFromAssemblies(dynamicAssembly);
35+
cfg.RegisterGenericHandlers = true;
3536
});
3637

3738
var provider = services.BuildServiceProvider();
@@ -93,24 +94,6 @@ public void ShouldNotRegisterDuplicateHandlers(int numberOfClasses, int numberOf
9394
hasDuplicates.ShouldBeFalse();
9495
}
9596

96-
[Fact]
97-
public void ShouldThrowExceptionWhenRegisterningHandlersWithNoConstraints()
98-
{
99-
IServiceCollection services = new ServiceCollection();
100-
services.AddSingleton(new Logger());
101-
102-
var assembly = GenerateMissingConstraintsAssembly();
103-
104-
Should.Throw<ArgumentException>(() =>
105-
{
106-
services.AddMediatR(cfg =>
107-
{
108-
cfg.RegisterServicesFromAssembly(assembly);
109-
});
110-
})
111-
.Message.ShouldContain("When registering generic requests with more than two type parameters, each type parameter must have at least one constraint of type interface or class.");
112-
}
113-
11497
[Fact]
11598
public void ShouldThrowExceptionWhenTypesClosingExceedsMaximum()
11699
{
@@ -124,6 +107,7 @@ public void ShouldThrowExceptionWhenTypesClosingExceedsMaximum()
124107
services.AddMediatR(cfg =>
125108
{
126109
cfg.RegisterServicesFromAssembly(assembly);
110+
cfg.RegisterGenericHandlers = true;
127111
});
128112
})
129113
.Message.ShouldContain("One of the generic type parameter's count of types that can close exceeds the maximum length allowed");
@@ -142,6 +126,7 @@ public void ShouldThrowExceptionWhenGenericHandlerRegistrationsExceedsMaximum()
142126
services.AddMediatR(cfg =>
143127
{
144128
cfg.RegisterServicesFromAssembly(assembly);
129+
cfg.RegisterGenericHandlers = true;
145130
});
146131
})
147132
.Message.ShouldContain("The total number of generic type registrations exceeds the maximum allowed");
@@ -160,6 +145,7 @@ public void ShouldThrowExceptionWhenGenericTypeParametersExceedsMaximum()
160145
services.AddMediatR(cfg =>
161146
{
162147
cfg.RegisterServicesFromAssembly(assembly);
148+
cfg.RegisterGenericHandlers = true;
163149
});
164150
})
165151
.Message.ShouldContain("The number of generic type parameters exceeds the maximum allowed");
@@ -181,6 +167,7 @@ public void ShouldThrowExceptionWhenTimeoutOccurs()
181167
cfg.MaxGenericTypeRegistrations = 0;
182168
cfg.MaxTypesClosing = 0;
183169
cfg.RegistrationTimeout = 1000;
170+
cfg.RegisterGenericHandlers = true;
184171
cfg.RegisterServicesFromAssembly(assembly);
185172
});
186173
})

test/MediatR.Tests/MicrosoftExtensionsDI/AssemblyResolutionTests.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ public AssemblyResolutionTests()
1515
{
1616
IServiceCollection services = new ServiceCollection();
1717
services.AddSingleton(new Logger());
18-
services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(Ping).Assembly));
18+
services.AddMediatR(cfg =>
19+
{
20+
cfg.RegisterServicesFromAssembly(typeof(Ping).Assembly);
21+
cfg.RegisterGenericHandlers = true;
22+
});
1923
_provider = services.BuildServiceProvider();
2024
}
2125

test/MediatR.Tests/MicrosoftExtensionsDI/BaseGenericRequestHandlerTests.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@
99
namespace MediatR.Tests.MicrosoftExtensionsDI
1010
{
1111
public abstract class BaseGenericRequestHandlerTests
12-
{
13-
14-
protected static Assembly GenerateMissingConstraintsAssembly() =>
15-
CreateAssemblyModuleBuilder("MissingConstraintsAssembly", 3, 3, CreateHandlerForMissingConstraintsTest);
16-
12+
{
1713
protected static Assembly GenerateTypesClosingExceedsMaximumAssembly() =>
1814
CreateAssemblyModuleBuilder("ExceedsMaximumTypesClosingAssembly", 201, 1, CreateHandlerForExceedsMaximumClassesTest);
1915

test/MediatR.Tests/SendTests.cs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ public SendTests()
1818
{
1919
_dependency = new Dependency();
2020
var services = new ServiceCollection();
21-
services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(typeof(Ping).Assembly));
21+
services.AddMediatR(cfg =>
22+
{
23+
cfg.RegisterServicesFromAssemblies(typeof(Ping).Assembly);
24+
cfg.RegisterGenericHandlers = true;
25+
});
2226
services.AddSingleton(_dependency);
2327
_serviceProvider = services.BuildServiceProvider();
2428
_mediator = _serviceProvider.GetService<IMediator>()!;
@@ -248,8 +252,13 @@ public async Task Should_resolve_closed_handler_if_defined()
248252
{
249253
var dependency = new Dependency();
250254
var services = new ServiceCollection();
251-
services.AddSingleton(dependency);
252-
services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(Assembly.GetExecutingAssembly()));
255+
services.AddSingleton(dependency);
256+
services.AddMediatR(cfg =>
257+
{
258+
cfg.RegisterServicesFromAssemblies(Assembly.GetExecutingAssembly());
259+
cfg.RegisterGenericHandlers = true;
260+
});
261+
253262
services.AddTransient<IRequestHandler<VoidGenericPing<PongExtension>>,TestClass1PingRequestHandler>();
254263
var serviceProvider = services.BuildServiceProvider();
255264
var mediator = serviceProvider.GetService<IMediator>()!;
@@ -267,7 +276,11 @@ public async Task Should_resolve_open_handler_if_not_defined()
267276
var dependency = new Dependency();
268277
var services = new ServiceCollection();
269278
services.AddSingleton(dependency);
270-
services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblies(Assembly.GetExecutingAssembly()));
279+
services.AddMediatR(cfg =>
280+
{
281+
cfg.RegisterServicesFromAssemblies(Assembly.GetExecutingAssembly());
282+
cfg.RegisterGenericHandlers = true;
283+
});
271284
services.AddTransient<IRequestHandler<VoidGenericPing<PongExtension>>, TestClass1PingRequestHandler>();
272285
var serviceProvider = services.BuildServiceProvider();
273286
var mediator = serviceProvider.GetService<IMediator>()!;

0 commit comments

Comments
 (0)