Skip to content

Commit dd3af49

Browse files
Merge branch 'main' into js/file-system-fixes
2 parents 942c2f2 + b922f29 commit dd3af49

2 files changed

Lines changed: 80 additions & 1 deletion

File tree

src/ImageSharp.Web/DependencyInjection/ImageSharpBuilderExtensions.cs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,45 @@ public static IImageSharpBuilder AddProvider<TProvider>(this IImageSharpBuilder
155155
return builder;
156156
}
157157

158+
/// <summary>
159+
/// Inserts the given <see cref="IImageProvider"/> at the give index into to the provider collection within the service collection.
160+
/// </summary>
161+
/// <typeparam name="TProvider">The type of class implementing <see cref="IImageProvider"/>to add.</typeparam>
162+
/// <param name="builder">The core builder.</param>
163+
/// <param name="index">The zero-based index at which the provider should be inserted.</param>
164+
/// <returns>The <see cref="IImageSharpBuilder"/>.</returns>
165+
public static IImageSharpBuilder InsertProvider<TProvider>(this IImageSharpBuilder builder, int index)
166+
where TProvider : class, IImageProvider
167+
{
168+
var descriptors = builder.Services.Where(x => x.ServiceType == typeof(IImageProvider)).ToList();
169+
builder.ClearProviders();
170+
171+
descriptors.Insert(index, ServiceDescriptor.Singleton<IImageProvider, TProvider>());
172+
173+
builder.Services.TryAddEnumerable(descriptors);
174+
return builder;
175+
}
176+
177+
/// <summary>
178+
/// Inserts the given <see cref="IImageProvider"/> at the give index into the provider collection within the service collection.
179+
/// </summary>
180+
/// <typeparam name="TProvider">The type of class implementing <see cref="IImageProvider"/>to add.</typeparam>
181+
/// <param name="builder">The core builder.</param>
182+
/// <param name="index">The zero-based index at which the provider should be inserted.</param>
183+
/// <param name="implementationFactory">The factory method for returning a <see cref="IImageProvider"/>.</param>
184+
/// <returns>The <see cref="IImageSharpBuilder"/>.</returns>
185+
public static IImageSharpBuilder InsertProvider<TProvider>(this IImageSharpBuilder builder, int index, Func<IServiceProvider, TProvider> implementationFactory)
186+
where TProvider : class, IImageProvider
187+
{
188+
var descriptors = builder.Services.Where(x => x.ServiceType == typeof(IImageProvider)).ToList();
189+
builder.ClearProviders();
190+
191+
descriptors.Insert(index, ServiceDescriptor.Singleton<IImageProvider>(implementationFactory));
192+
193+
builder.Services.TryAddEnumerable(descriptors);
194+
return builder;
195+
}
196+
158197
/// <summary>
159198
/// Removes the given <see cref="IImageProvider"/> from the provider collection within the service collection.
160199
/// </summary>
@@ -166,7 +205,6 @@ public static IImageSharpBuilder RemoveProvider<TProvider>(this IImageSharpBuild
166205
{
167206
ServiceDescriptor descriptor = builder.Services.FirstOrDefault(x =>
168207
x.ServiceType == typeof(IImageProvider)
169-
&& x.Lifetime == ServiceLifetime.Singleton
170208
&& (x.ImplementationType == typeof(TProvider)
171209
|| (x.ImplementationFactory?.GetMethodInfo().ReturnType == typeof(TProvider))));
172210

tests/ImageSharp.Web.Tests/DependencyInjection/ServiceRegistrationExtensionsTests.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Copyright (c) Six Labors.
22
// Licensed under the Apache License, Version 2.0.
33

4+
using System.Collections.Generic;
5+
using System.Linq;
46
using System.Reflection;
57
using Microsoft.Extensions.DependencyInjection;
68
using SixLabors.ImageSharp.Web.Caching;
@@ -40,6 +42,8 @@ private static bool IsServiceImplementationFactory<TService, TImplementation>(Se
4042
(descriptor.ImplementationFactory?.GetMethodInfo().ReturnType == typeof(TImplementation) ||
4143
descriptor.ImplementationFactory?.Invoke(null)?.GetType() == typeof(TImplementation)); // OK to invoke the factory in tests
4244

45+
private static IReadOnlyList<ServiceDescriptor> GetCollection<T>(IServiceCollection serviceDescriptors) => serviceDescriptors.Where(x => x.ServiceType == typeof(T)).ToList();
46+
4347
[Fact]
4448
public void DefaultServicesAreRegistered()
4549
{
@@ -174,6 +178,24 @@ public void CanAddRemoveImageProviders()
174178
Assert.DoesNotContain(services, IsService<IImageProvider, MockImageProvider>);
175179
}
176180

181+
[Fact]
182+
public void CanInsertRemoveImageProviders()
183+
{
184+
var services = new ServiceCollection();
185+
IImageSharpBuilder builder = services.AddImageSharp();
186+
187+
builder.InsertProvider<MockImageProvider>(0);
188+
Assert.Single(services, IsService<IImageProvider, MockImageProvider>);
189+
Assert.Single(services, IsServiceImplementationType<IImageProvider, MockImageProvider>);
190+
191+
IReadOnlyList<ServiceDescriptor> providers = GetCollection<IImageProvider>(services);
192+
Assert.Equal(2, providers.Count);
193+
Assert.True(IsService<IImageProvider, MockImageProvider>(providers[0]));
194+
195+
builder.RemoveProvider<MockImageProvider>();
196+
Assert.DoesNotContain(services, IsService<IImageProvider, MockImageProvider>);
197+
}
198+
177199
[Fact]
178200
public void CanAddRemoveFactoryImageProviders()
179201
{
@@ -188,6 +210,25 @@ public void CanAddRemoveFactoryImageProviders()
188210
Assert.DoesNotContain(services, IsService<IImageProvider, MockImageProvider>);
189211
}
190212

213+
[Fact]
214+
public void CanInsertRemoveFactoryImageProviders()
215+
{
216+
var services = new ServiceCollection();
217+
IImageSharpBuilder builder = services.AddImageSharp();
218+
219+
builder.InsertProvider(0, _ => new MockImageProvider());
220+
Assert.Single(services, IsService<IImageProvider, MockImageProvider>);
221+
Assert.Single(services, IsServiceImplementationFactory<IImageProvider, MockImageProvider>);
222+
223+
IReadOnlyList<ServiceDescriptor> providers = GetCollection<IImageProvider>(services);
224+
Assert.Equal(2, providers.Count);
225+
Assert.True(IsService<IImageProvider, MockImageProvider>(providers[0]));
226+
Assert.True(IsServiceImplementationFactory<IImageProvider, MockImageProvider>(providers[0]));
227+
228+
builder.RemoveProvider<MockImageProvider>();
229+
Assert.DoesNotContain(services, IsService<IImageProvider, MockImageProvider>);
230+
}
231+
191232
[Fact]
192233
public void CanAddRemoveAllImageProviders()
193234
{

0 commit comments

Comments
 (0)