Skip to content

Commit cc0acdd

Browse files
author
Kamil Zakiev
committed
reduced code duplication
1 parent 1dff356 commit cc0acdd

File tree

1 file changed

+12
-24
lines changed

1 file changed

+12
-24
lines changed

src/Scrutor/ServiceCollectionExtensions.Decoration.cs

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)