Skip to content

Commit

Permalink
reduced code duplication
Browse files Browse the repository at this point in the history
  • Loading branch information
Kamil Zakiev committed Jun 6, 2019
1 parent 1dff356 commit cc0acdd
Showing 1 changed file with 12 additions and 24 deletions.
36 changes: 12 additions & 24 deletions src/Scrutor/ServiceCollectionExtensions.Decoration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,13 @@ private static IServiceCollection DecorateOpenGeneric(this IServiceCollection se

private static IServiceCollection DecorateOpenGeneric(this IServiceCollection services, Type serviceType, Func<object, IServiceProvider, object> decorator)
{
if (services.TryDecorateOpenGeneric(serviceType, decorator))
bool TryDecorate(Type[] typeArguments)
{
var closedServiceType = serviceType.MakeGenericType(typeArguments);
return services.TryDecorateDescriptors(closedServiceType, x => x.Decorate(decorator));
}

if (services.TryDecorateOpenGeneric(serviceType, openTypeDecorator: TryDecorate))
{
return services;
}
Expand All @@ -268,10 +274,12 @@ private static IServiceCollection DecorateOpenGeneric(this IServiceCollection se
throw new MissingTypeRegistrationException(serviceType);
}

private static bool TryDecorateOpenGeneric(this IServiceCollection services, Type serviceType, Type decoratorType)
private static bool TryDecorateOpenGeneric(this IServiceCollection services, Type serviceType, Type decoratorType = null, Func<Type[], bool> openTypeDecorator = null)
{
bool TryDecorate(Type[] typeArguments)
{
Preconditions.NotNull(decoratorType, nameof(decoratorType));

var closedServiceType = serviceType.MakeGenericType(typeArguments);
var closedDecoratorType = decoratorType.MakeGenericType(typeArguments);

Expand All @@ -288,28 +296,8 @@ bool TryDecorate(Type[] typeArguments)
return false;
}

return arguments.Aggregate(true, (result, args) => result && TryDecorate(args));
}

private static bool TryDecorateOpenGeneric(this IServiceCollection services, Type serviceType, Func<object, IServiceProvider, object> decorator)
{
bool TryDecorate(Type[] typeArguments)
{
var closedServiceType = serviceType.MakeGenericType(typeArguments);
return services.TryDecorateDescriptors(closedServiceType, x => x.Decorate(decorator));
}

var arguments = services
.Where(descriptor => descriptor.ServiceType.IsAssignableTo(serviceType))
.Select(descriptor => descriptor.ServiceType.GenericTypeArguments)
.ToArray();

if (arguments.Length == 0)
{
return false;
}

return arguments.Aggregate(true, (result, args) => result && TryDecorate(args));
var tryDecorate = openTypeDecorator ?? TryDecorate;
return arguments.Aggregate(true, (result, args) => result && tryDecorate(args));
}

private static IServiceCollection DecorateDescriptors(this IServiceCollection services, Type serviceType, Func<ServiceDescriptor, ServiceDescriptor> decorator)
Expand Down

0 comments on commit cc0acdd

Please sign in to comment.