Malekai
Malekai

Reputation: 45

ServiceProvider.GetServices with Open Types

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

Answers (1)

Qiang Fu
Qiang Fu

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();

Test result: enter image description here

Upvotes: 0

Related Questions