Reputation: 45
I am trying to retrieve all instances of a registered service that implements an IMyInterface<T>
where T
is a base class so I can read all the implementations of T
being handled.
So far, I have tried:
var registeredInstances = _serviceProvider.GetServices(typeof(IMyInterface<MyBaseClass>)).ToList();
var registeredInstances = _serviceProvider.GetServices(typeof(IMyInteface<>)).ToList();
First one returns no results, second one errors as GetServices
cannot use open types.
What am I missing here?
Upvotes: 0
Views: 58
Reputation: 8761
You could try following sample:
public interface IMyInterface<T> where T : BaseClass
{
void Process(T item);
}
public abstract class BaseClass { }
public class Derived1 : BaseClass { }
public class Derived2 : BaseClass { }
public class Service1 : IMyInterface<Derived1>
{
public void Process(Derived1 item) { Console.WriteLine("Service1 processing Derived1"); }
}
public class Service2 : IMyInterface<Derived2>
{
public void Process(Derived2 item) { Console.WriteLine("Service2 processing Derived2"); }
}
...
builder.Services.AddTransient<IMyInterface<Derived1>, Service1>();
builder.Services.AddTransient<IMyInterface<Derived2>, Service2>();
To get all services
var serviceType = typeof(IMyInterface<>);
var derivedTypes = typeof(BaseClass).Assembly.GetTypes()
.Where(t => typeof(BaseClass).IsAssignableFrom(t) && t != typeof(BaseClass));
var implementations = new List<object>();
foreach (var derivedType in derivedTypes)
{
var genericType = serviceType.MakeGenericType(derivedType);
var services = _serviceProvider.GetServices(genericType);
implementations.AddRange(services);
}
var registeredInstances = implementations.ToArray();
Upvotes: 0