Skip to content

Commit 0554326

Browse files
Refactor filter descriptor type checks in SwaggerGen (#3125)
Introduce `IsAssignableTo` method in `FilterDescriptor` class to check if `FilterInstance` is an instance of a specified type or if the `Type` property is assignable to the specified type.
1 parent e1c5153 commit 0554326

File tree

3 files changed

+41
-8
lines changed

3 files changed

+41
-8
lines changed

src/Swashbuckle.AspNetCore.SwaggerGen/DependencyInjection/ConfigureSwaggerGeneratorOptions.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,51 +36,51 @@ public void Configure(SwaggerGeneratorOptions options)
3636

3737
foreach (var filterDescriptor in _swaggerGenOptions.ParameterFilterDescriptors)
3838
{
39-
if (filterDescriptor.Type.IsAssignableTo(typeof(IParameterFilter)))
39+
if (filterDescriptor.IsAssignableTo(typeof(IParameterFilter)))
4040
{
4141
options.ParameterFilters.Add(GetOrCreateFilter<IParameterFilter>(filterDescriptor));
4242
}
4343

44-
if (filterDescriptor.Type.IsAssignableTo(typeof(IParameterAsyncFilter)))
44+
if (filterDescriptor.IsAssignableTo(typeof(IParameterAsyncFilter)))
4545
{
4646
options.ParameterAsyncFilters.Add(GetOrCreateFilter<IParameterAsyncFilter>(filterDescriptor));
4747
}
4848
}
4949

5050
foreach (var filterDescriptor in _swaggerGenOptions.RequestBodyFilterDescriptors)
5151
{
52-
if (filterDescriptor.Type.IsAssignableTo(typeof(IRequestBodyFilter)))
52+
if (filterDescriptor.IsAssignableTo(typeof(IRequestBodyFilter)))
5353
{
5454
options.RequestBodyFilters.Add(GetOrCreateFilter<IRequestBodyFilter>(filterDescriptor));
5555
}
5656

57-
if (filterDescriptor.Type.IsAssignableTo(typeof(IRequestBodyAsyncFilter)))
57+
if (filterDescriptor.IsAssignableTo(typeof(IRequestBodyAsyncFilter)))
5858
{
5959
options.RequestBodyAsyncFilters.Add(GetOrCreateFilter<IRequestBodyAsyncFilter>(filterDescriptor));
6060
}
6161
}
6262

6363
foreach (var filterDescriptor in _swaggerGenOptions.OperationFilterDescriptors)
6464
{
65-
if (filterDescriptor.Type.IsAssignableTo(typeof(IOperationFilter)))
65+
if (filterDescriptor.IsAssignableTo(typeof(IOperationFilter)))
6666
{
6767
options.OperationFilters.Add(GetOrCreateFilter<IOperationFilter>(filterDescriptor));
6868
}
6969

70-
if (filterDescriptor.Type.IsAssignableTo(typeof(IOperationAsyncFilter)))
70+
if (filterDescriptor.IsAssignableTo(typeof(IOperationAsyncFilter)))
7171
{
7272
options.OperationAsyncFilters.Add(GetOrCreateFilter<IOperationAsyncFilter>(filterDescriptor));
7373
}
7474
}
7575

7676
foreach (var filterDescriptor in _swaggerGenOptions.DocumentFilterDescriptors)
7777
{
78-
if (filterDescriptor.Type.IsAssignableTo(typeof(IDocumentFilter)))
78+
if (filterDescriptor.IsAssignableTo(typeof(IDocumentFilter)))
7979
{
8080
options.DocumentFilters.Add(GetOrCreateFilter<IDocumentFilter>(filterDescriptor));
8181
}
8282

83-
if (filterDescriptor.Type.IsAssignableTo(typeof(IDocumentAsyncFilter)))
83+
if (filterDescriptor.IsAssignableTo(typeof(IDocumentAsyncFilter)))
8484
{
8585
options.DocumentAsyncFilters.Add(GetOrCreateFilter<IDocumentAsyncFilter>(filterDescriptor));
8686
}

src/Swashbuckle.AspNetCore.SwaggerGen/DependencyInjection/SwaggerGenOptions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,11 @@ public class FilterDescriptor
3232
public object[] Arguments { get; set; }
3333

3434
public object FilterInstance { get; set; }
35+
36+
internal bool IsAssignableTo(Type type)
37+
{
38+
return (FilterInstance != null && type.IsInstanceOfType(FilterInstance)) ||
39+
(Type != null && Type.IsAssignableTo(type));
40+
}
3541
}
3642
}

test/Swashbuckle.AspNetCore.SwaggerGen.Test/ConfigureSwaggerGeneratorOptionsTests.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,4 +412,31 @@ public static void AddingDocumentAsyncFilterTypes_WhenConfiguringOptions_Differe
412412
Assert.Equal(2, swaggerGeneratorOptions.DocumentAsyncFilters.Count);
413413
Assert.NotSame(swaggerGeneratorOptions.DocumentAsyncFilters.First(), swaggerGeneratorOptions.DocumentAsyncFilters.Last());
414414
}
415+
416+
[Fact]
417+
public static void AddingFilterDescriptorWithFilterInstance_WhenConfiguringOptions_NoExceptionIsThrown()
418+
{
419+
var webhostingEnvironment = Substitute.For<IWebHostEnvironment>();
420+
webhostingEnvironment.ApplicationName.Returns("Swashbuckle.AspNetCore.SwaggerGen.Test");
421+
422+
var options = new SwaggerGenOptions();
423+
options.OperationFilterDescriptors.Add(
424+
new FilterDescriptor()
425+
{
426+
Type = null,
427+
FilterInstance = new TestOperationFilter(),
428+
});
429+
430+
using var serviceProvider = new ServiceCollection().BuildServiceProvider();
431+
432+
var configureSwaggerGeneratorOptions = new ConfigureSwaggerGeneratorOptions(
433+
Options.Create(options),
434+
serviceProvider,
435+
webhostingEnvironment);
436+
var swaggerGeneratorOptions = new SwaggerGeneratorOptions();
437+
438+
configureSwaggerGeneratorOptions.Configure(swaggerGeneratorOptions);
439+
440+
Assert.Single(swaggerGeneratorOptions.OperationFilters);
441+
}
415442
}

0 commit comments

Comments
 (0)