Skip to content

Commit cbb16f9

Browse files
authored
Merge pull request #857 from asimmon/skip-bcl-on-net6-and-later
Skip unnecessary BCL package reference if targeting .NET 6 or later
2 parents 86ab7ec + f4de819 commit cbb16f9

File tree

5 files changed

+65
-73
lines changed

5 files changed

+65
-73
lines changed

src/MediatR/MediatR.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<Authors>Jimmy Bogard</Authors>
55
<Description>Simple, unambitious mediator implementation in .NET</Description>
66
<Copyright>Copyright Jimmy Bogard</Copyright>
7-
<TargetFramework>netstandard2.0</TargetFramework>
7+
<TargetFrameworks>netstandard2.0;net6.0</TargetFrameworks>
88
<Nullable>enable</Nullable>
99
<Features>strict</Features>
1010
<PackageTags>mediator;request;response;queries;commands;notifications</PackageTags>
@@ -32,7 +32,7 @@
3232
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
3333
</PackageReference>
3434
<PackageReference Include="MediatR.Contracts" Version="[2.0.1, 3.0.0)" />
35-
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="6.0.0" />
35+
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="6.0.0" Condition="'$(TargetFramework)' == 'netstandard2.0'" />
3636
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0" />
3737
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
3838
<PackageReference Include="MinVer" Version="4.3.0" PrivateAssets="All" />

src/MediatR/Mediator.cs

Lines changed: 54 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,12 @@ public Task<TResponse> Send<TResponse>(IRequest<TResponse> request, Cancellation
4646
throw new ArgumentNullException(nameof(request));
4747
}
4848

49-
var requestType = request.GetType();
50-
51-
var handler = (RequestHandlerWrapper<TResponse>)_requestHandlers.GetOrAdd(requestType,
52-
static t => (RequestHandlerBase)(Activator.CreateInstance(typeof(RequestHandlerWrapperImpl<,>).MakeGenericType(t, typeof(TResponse)))
53-
?? throw new InvalidOperationException($"Could not create wrapper type for {t}")));
49+
var handler = (RequestHandlerWrapper<TResponse>)_requestHandlers.GetOrAdd(request.GetType(), static requestType =>
50+
{
51+
var wrapperType = typeof(RequestHandlerWrapperImpl<,>).MakeGenericType(requestType, typeof(TResponse));
52+
var wrapper = Activator.CreateInstance(wrapperType) ?? throw new InvalidOperationException($"Could not create wrapper type for {requestType}");
53+
return (RequestHandlerBase)wrapper;
54+
});
5455

5556
return handler.Handle(request, _serviceProvider, cancellationToken);
5657
}
@@ -63,11 +64,12 @@ public Task Send<TRequest>(TRequest request, CancellationToken cancellationToken
6364
throw new ArgumentNullException(nameof(request));
6465
}
6566

66-
var requestType = request.GetType();
67-
68-
var handler = (RequestHandlerWrapper)_requestHandlers.GetOrAdd(requestType,
69-
static t => (RequestHandlerBase)(Activator.CreateInstance(typeof(RequestHandlerWrapperImpl<>).MakeGenericType(t))
70-
?? throw new InvalidOperationException($"Could not create wrapper type for {t}")));
67+
var handler = (RequestHandlerWrapper)_requestHandlers.GetOrAdd(request.GetType(), static requestType =>
68+
{
69+
var wrapperType = typeof(RequestHandlerWrapperImpl<>).MakeGenericType(requestType);
70+
var wrapper = Activator.CreateInstance(wrapperType) ?? throw new InvalidOperationException($"Could not create wrapper type for {requestType}");
71+
return (RequestHandlerBase)wrapper;
72+
});
7173

7274
return handler.Handle(request, _serviceProvider, cancellationToken);
7375
}
@@ -78,41 +80,31 @@ public Task Send<TRequest>(TRequest request, CancellationToken cancellationToken
7880
{
7981
throw new ArgumentNullException(nameof(request));
8082
}
81-
var requestType = request.GetType();
82-
var handler = _requestHandlers.GetOrAdd(requestType,
83-
static requestTypeKey =>
84-
{
85-
var requestInterfaceType = requestTypeKey
86-
.GetInterfaces()
87-
.FirstOrDefault(static i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IRequest<>));
8883

89-
Type wrapperType;
84+
var handler = _requestHandlers.GetOrAdd(request.GetType(), static requestType =>
85+
{
86+
Type wrapperType;
9087

88+
var requestInterfaceType = requestType.GetInterfaces().FirstOrDefault(static i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IRequest<>));
89+
if (requestInterfaceType is null)
90+
{
91+
requestInterfaceType = requestType.GetInterfaces().FirstOrDefault(static i => i == typeof(IRequest));
9192
if (requestInterfaceType is null)
9293
{
93-
requestInterfaceType = requestTypeKey
94-
.GetInterfaces()
95-
.FirstOrDefault(static i => i == typeof(IRequest));
96-
97-
if (requestInterfaceType is null)
98-
{
99-
throw new ArgumentException($"{requestTypeKey.Name} does not implement {nameof(IRequest)}",
100-
nameof(request));
101-
}
102-
103-
wrapperType =
104-
typeof(RequestHandlerWrapperImpl<>).MakeGenericType(requestTypeKey);
105-
}
106-
else
107-
{
108-
var responseType = requestInterfaceType.GetGenericArguments()[0];
109-
wrapperType =
110-
typeof(RequestHandlerWrapperImpl<,>).MakeGenericType(requestTypeKey, responseType);
94+
throw new ArgumentException($"{requestType.Name} does not implement {nameof(IRequest)}", nameof(request));
11195
}
11296

113-
return (RequestHandlerBase)(Activator.CreateInstance(wrapperType)
114-
?? throw new InvalidOperationException($"Could not create wrapper for type {wrapperType}"));
115-
});
97+
wrapperType = typeof(RequestHandlerWrapperImpl<>).MakeGenericType(requestType);
98+
}
99+
else
100+
{
101+
var responseType = requestInterfaceType.GetGenericArguments()[0];
102+
wrapperType = typeof(RequestHandlerWrapperImpl<,>).MakeGenericType(requestType, responseType);
103+
}
104+
105+
var wrapper = Activator.CreateInstance(wrapperType) ?? throw new InvalidOperationException($"Could not create wrapper for type {requestType}");
106+
return (RequestHandlerBase)wrapper;
107+
});
116108

117109
// call via dynamic dispatch to avoid calling through reflection for performance reasons
118110
return handler.Handle(request, _serviceProvider, cancellationToken);
@@ -149,10 +141,12 @@ protected virtual Task PublishCore(IEnumerable<NotificationHandlerExecutor> hand
149141

150142
private Task PublishNotification(INotification notification, CancellationToken cancellationToken = default)
151143
{
152-
var notificationType = notification.GetType();
153-
var handler = _notificationHandlers.GetOrAdd(notificationType,
154-
static t => (NotificationHandlerWrapper) (Activator.CreateInstance(typeof(NotificationHandlerWrapperImpl<>).MakeGenericType(t))
155-
?? throw new InvalidOperationException($"Could not create wrapper for type {t}")));
144+
var handler = _notificationHandlers.GetOrAdd(notification.GetType(), static notificationType =>
145+
{
146+
var wrapperType = typeof(NotificationHandlerWrapperImpl<>).MakeGenericType(notificationType);
147+
var wrapper = Activator.CreateInstance(wrapperType) ?? throw new InvalidOperationException($"Could not create wrapper for type {notificationType}");
148+
return (NotificationHandlerWrapper)wrapper;
149+
});
156150

157151
return handler.Handle(notification, _serviceProvider, PublishCore, cancellationToken);
158152
}
@@ -165,10 +159,12 @@ public IAsyncEnumerable<TResponse> CreateStream<TResponse>(IStreamRequest<TRespo
165159
throw new ArgumentNullException(nameof(request));
166160
}
167161

168-
var requestType = request.GetType();
169-
170-
var streamHandler = (StreamRequestHandlerWrapper<TResponse>) _streamRequestHandlers.GetOrAdd(requestType,
171-
t => (StreamRequestHandlerBase) Activator.CreateInstance(typeof(StreamRequestHandlerWrapperImpl<,>).MakeGenericType(requestType, typeof(TResponse))));
162+
var streamHandler = (StreamRequestHandlerWrapper<TResponse>)_streamRequestHandlers.GetOrAdd(request.GetType(), static requestType =>
163+
{
164+
var wrapperType = typeof(StreamRequestHandlerWrapperImpl<,>).MakeGenericType(requestType, typeof(TResponse));
165+
var wrapper = Activator.CreateInstance(wrapperType) ?? throw new InvalidOperationException($"Could not create wrapper for type {requestType}");
166+
return (StreamRequestHandlerBase)wrapper;
167+
});
172168

173169
var items = streamHandler.Handle(request, _serviceProvider, cancellationToken);
174170

@@ -183,26 +179,20 @@ public IAsyncEnumerable<TResponse> CreateStream<TResponse>(IStreamRequest<TRespo
183179
throw new ArgumentNullException(nameof(request));
184180
}
185181

186-
var requestType = request.GetType();
187-
188-
var handler = _streamRequestHandlers.GetOrAdd(requestType,
189-
requestTypeKey =>
182+
var handler = _streamRequestHandlers.GetOrAdd(request.GetType(), static requestType =>
183+
{
184+
var requestInterfaceType = requestType.GetInterfaces().FirstOrDefault(static i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IStreamRequest<>));
185+
if (requestInterfaceType is null)
190186
{
191-
var requestInterfaceType = requestTypeKey
192-
.GetInterfaces()
193-
.FirstOrDefault(static i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IStreamRequest<>));
194-
var isValidRequest = requestInterfaceType != null;
187+
throw new ArgumentException($"{requestType.Name} does not implement IStreamRequest<TResponse>", nameof(request));
188+
}
195189

196-
if (!isValidRequest)
197-
{
198-
throw new ArgumentException($"{requestType.Name} does not implement IStreamRequest<TResponse>", nameof(requestTypeKey));
199-
}
190+
var responseType = requestInterfaceType.GetGenericArguments()[0];
191+
var wrapperType = typeof(StreamRequestHandlerWrapperImpl<,>).MakeGenericType(requestType, responseType);
192+
var wrapper = Activator.CreateInstance(wrapperType) ?? throw new InvalidOperationException($"Could not create wrapper for type {requestType}");
193+
return (StreamRequestHandlerBase)wrapper;
194+
});
200195

201-
var responseType = requestInterfaceType!.GetGenericArguments()[0];
202-
return (StreamRequestHandlerBase) Activator.CreateInstance(typeof(StreamRequestHandlerWrapperImpl<,>).MakeGenericType(requestTypeKey, responseType));
203-
});
204-
205-
// call via dynamic dispatch to avoid calling through reflection for performance reasons
206196
var items = handler.Handle(request, _serviceProvider, cancellationToken);
207197

208198
return items;

src/MediatR/Pipeline/RequestExceptionActionProcessorBehavior.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace MediatR.Pipeline;
22

33
using Internal;
4+
using Microsoft.Extensions.DependencyInjection;
45
using System;
56
using System.Collections.Generic;
67
using System.Linq;
@@ -71,7 +72,7 @@ private static IEnumerable<Type> GetExceptionTypes(Type? exceptionType)
7172
var exceptionActionInterfaceType = typeof(IRequestExceptionAction<,>).MakeGenericType(typeof(TRequest), exceptionType);
7273
var enumerableExceptionActionInterfaceType = typeof(IEnumerable<>).MakeGenericType(exceptionActionInterfaceType);
7374

74-
var actionsForException = (IEnumerable<object>)_serviceProvider.GetService(enumerableExceptionActionInterfaceType);
75+
var actionsForException = (IEnumerable<object>)_serviceProvider.GetRequiredService(enumerableExceptionActionInterfaceType);
7576

7677
return HandlersOrderer.Prioritize(actionsForException.ToList(), request)
7778
.Select(action => (exceptionType, action));

src/MediatR/Pipeline/RequestExceptionProcessorBehavior.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace MediatR.Pipeline;
22

33
using Internal;
4+
using Microsoft.Extensions.DependencyInjection;
45
using System;
56
using System.Collections.Generic;
67
using System.Linq;
@@ -88,7 +89,7 @@ private static IEnumerable<Type> GetExceptionTypes(Type? exceptionType)
8889
var exceptionHandlerInterfaceType = typeof(IRequestExceptionHandler<,,>).MakeGenericType(typeof(TRequest), typeof(TResponse), exceptionType);
8990
var enumerableExceptionHandlerInterfaceType = typeof(IEnumerable<>).MakeGenericType(exceptionHandlerInterfaceType);
9091

91-
var exceptionHandlers = (IEnumerable<object>) _serviceProvider.GetService(enumerableExceptionHandlerInterfaceType);
92+
var exceptionHandlers = (IEnumerable<object>) _serviceProvider.GetRequiredService(enumerableExceptionHandlerInterfaceType);
9293

9394
return HandlersOrderer.Prioritize(exceptionHandlers.ToList(), request)
9495
.Select(handler => (exceptionType, action: handler));

src/MediatR/Registration/ServiceRegistrar.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ private static void ConnectImplementationsToTypesClosing(Type openRequestInterfa
105105
}
106106
}
107107

108-
private static bool IsMatchingWithInterface(Type handlerType, Type handlerInterface)
108+
private static bool IsMatchingWithInterface(Type? handlerType, Type handlerInterface)
109109
{
110110
if (handlerType == null || handlerInterface == null)
111111
{
@@ -186,15 +186,15 @@ var interfaceType in
186186
yield return interfaceType;
187187
}
188188
}
189-
else if (pluggedType.GetTypeInfo().BaseType.GetTypeInfo().IsGenericType &&
190-
(pluggedType.GetTypeInfo().BaseType.GetGenericTypeDefinition() == templateType))
189+
else if (pluggedType.GetTypeInfo().BaseType!.GetTypeInfo().IsGenericType &&
190+
(pluggedType.GetTypeInfo().BaseType!.GetGenericTypeDefinition() == templateType))
191191
{
192-
yield return pluggedType.GetTypeInfo().BaseType;
192+
yield return pluggedType.GetTypeInfo().BaseType!;
193193
}
194194

195195
if (pluggedType.GetTypeInfo().BaseType == typeof(object)) yield break;
196196

197-
foreach (var interfaceType in FindInterfacesThatClosesCore(pluggedType.GetTypeInfo().BaseType, templateType))
197+
foreach (var interfaceType in FindInterfacesThatClosesCore(pluggedType.GetTypeInfo().BaseType!, templateType))
198198
{
199199
yield return interfaceType;
200200
}

0 commit comments

Comments
 (0)