@@ -245,7 +245,13 @@ private static IServiceCollection DecorateOpenGeneric(this IServiceCollection se
245245
246246 private static IServiceCollection DecorateOpenGeneric ( this IServiceCollection services , Type serviceType , Func < object , IServiceProvider , object > decorator )
247247 {
248- if ( services . TryDecorateOpenGeneric ( serviceType , decorator ) )
248+ bool TryDecorate ( Type [ ] typeArguments )
249+ {
250+ var closedServiceType = serviceType . MakeGenericType ( typeArguments ) ;
251+ return services . TryDecorateDescriptors ( closedServiceType , x => x . Decorate ( decorator ) ) ;
252+ }
253+
254+ if ( services . TryDecorateOpenGeneric ( serviceType , openTypeDecorator : TryDecorate ) )
249255 {
250256 return services ;
251257 }
@@ -268,10 +274,12 @@ private static IServiceCollection DecorateOpenGeneric(this IServiceCollection se
268274 throw new MissingTypeRegistrationException ( serviceType ) ;
269275 }
270276
271- private static bool TryDecorateOpenGeneric ( this IServiceCollection services , Type serviceType , Type decoratorType )
277+ private static bool TryDecorateOpenGeneric ( this IServiceCollection services , Type serviceType , Type decoratorType = null , Func < Type [ ] , bool > openTypeDecorator = null )
272278 {
273279 bool TryDecorate ( Type [ ] typeArguments )
274280 {
281+ Preconditions . NotNull ( decoratorType , nameof ( decoratorType ) ) ;
282+
275283 var closedServiceType = serviceType . MakeGenericType ( typeArguments ) ;
276284 var closedDecoratorType = decoratorType . MakeGenericType ( typeArguments ) ;
277285
@@ -288,28 +296,8 @@ bool TryDecorate(Type[] typeArguments)
288296 return false ;
289297 }
290298
291- return arguments . Aggregate ( true , ( result , args ) => result && TryDecorate ( args ) ) ;
292- }
293-
294- private static bool TryDecorateOpenGeneric ( this IServiceCollection services , Type serviceType , Func < object , IServiceProvider , object > decorator )
295- {
296- bool TryDecorate ( Type [ ] typeArguments )
297- {
298- var closedServiceType = serviceType . MakeGenericType ( typeArguments ) ;
299- return services . TryDecorateDescriptors ( closedServiceType , x => x . Decorate ( decorator ) ) ;
300- }
301-
302- var arguments = services
303- . Where ( descriptor => descriptor . ServiceType . IsAssignableTo ( serviceType ) )
304- . Select ( descriptor => descriptor . ServiceType . GenericTypeArguments )
305- . ToArray ( ) ;
306-
307- if ( arguments . Length == 0 )
308- {
309- return false ;
310- }
311-
312- return arguments . Aggregate ( true , ( result , args ) => result && TryDecorate ( args ) ) ;
299+ var tryDecorate = openTypeDecorator ?? TryDecorate ;
300+ return arguments . Aggregate ( true , ( result , args ) => result && tryDecorate ( args ) ) ;
313301 }
314302
315303 private static IServiceCollection DecorateDescriptors ( this IServiceCollection services , Type serviceType , Func < ServiceDescriptor , ServiceDescriptor > decorator )
0 commit comments