Skip to content

Commit

Permalink
Handled unregistered IUrlHelperFactory. Fixes dotnet#673
Browse files Browse the repository at this point in the history
  • Loading branch information
Chris Martinez authored and commonsensesoftware committed Oct 24, 2020
1 parent 261564c commit cb95c4f
Showing 1 changed file with 18 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -99,21 +99,32 @@ static object CreateInstance( this IServiceProvider services, ServiceDescriptor

static ServiceDescriptor WithUrlHelperFactoryDecorator( IServiceCollection services )
{
var descriptor = services.First( sd => sd.ServiceType == typeof( IUrlHelperFactory ) );
var factory = ActivatorUtilities.CreateFactory( typeof( ApiVersionUrlHelperFactory ), new[] { typeof( IUrlHelperFactory ) } );
var descriptor = services.FirstOrDefault( sd => sd.ServiceType == typeof( IUrlHelperFactory ) );
var lifetime = ServiceLifetime.Singleton;
Func<IServiceProvider, object> instantiate = sp => new UrlHelperFactory();

if ( descriptor != null )
{
lifetime = descriptor.Lifetime;
instantiate = sp => sp.CreateInstance( descriptor );
}

IUrlHelperFactory NewFactory( IServiceProvider serviceProvider )
{
var decorated = serviceProvider.CreateInstance( descriptor! );
var decorated = instantiate( serviceProvider );
var options = serviceProvider.GetRequiredService<IOptions<ApiVersioningOptions>>().Value;
var instance = options.ApiVersionReader.VersionsByUrlSegment() ?
factory( serviceProvider, new[] { decorated } ) :
decorated;
var instance = decorated;

if ( options.ApiVersionReader.VersionsByUrlSegment() )
{
var factory = ActivatorUtilities.CreateFactory( typeof( ApiVersionUrlHelperFactory ), new[] { typeof( IUrlHelperFactory ) } );
instance = factory( serviceProvider, new[] { decorated } );
}

return (IUrlHelperFactory) instance;
}

return Describe( typeof( IUrlHelperFactory ), NewFactory, descriptor.Lifetime );
return Describe( typeof( IUrlHelperFactory ), NewFactory, lifetime );
}
}
}

0 comments on commit cb95c4f

Please sign in to comment.