Resolve services by key using a wrapped delegate
$ dotnet add package Devseesharp.KeyedServices.KeyedResolverA extension that injects a wrapper that can resolve services by key
Install directly with..
Install-Package Devseesharp.KeyedServiceResolver.Extensions.Microsoft.DependencyInjection
dotnet add package Devseesharp.KeyedServiceResolver.Extensions.Microsoft.DependencyInjection
nuget.org/packages/Devseesharp.KeyedServiceResolver.Extensions.Microsoft.DependencyInjection
First register your services with scope of choice. Then you register the resolver IKeyedResolver<TKey,TService> using the AddKeyedServiceFactory() extension.
// #1
services.AddTransient<TestService1>();
services.AddTransient<TestService2>();
// #2
services.AddKeyedServiceFactory<FakeEnumKeys, ITestService>(provider => key =>
{
return key switch
{
FakeEnumKeys.Key1 => provider.GetRequiredService<TestService1>() as ITestService,
FakeEnumKeys.Key2 => provider.GetRequiredService<TestService2>(),
_ => throw new KeyNotFoundException()
};
}, ServiceLifetime.Scoped);
Later when you want to get the service by key, you inject the IKeyedResolver<TKey,TService> into your object and call the method Get(TKey), that will then resolve your service.
public class DevseesharpService
{
private ITestService _fakeService2;
public DevseesharpService(IKeyedServiceResolver<FakeEnumKeys, ITestService> keyedServiceResolver)
{
_fakeService2 = keyedServiceResolver.Get(FakeEnumKeys.Key2);
}
}