Search code examples
c#.netdependency-injectionsimple-injector

Simple Injector - RegisterAll registration injects empty collection in constructor


I have the following factory:

public class MyFactory : IMyFactory
{
    private readonly IEnumerable<IMyService> myServices

    public MyFactory(IEnumerable<IMyService> myServices)
    {   
        this.myServices = myServices;
    }
}

I am registering my IEnumerable<IMyService> like this:

container.Register<IMyFactory, MyFactory>();

container.RegisterAll<IMyService>(
    from s in AppDomain.CurrentDomain.GetAssemblies()
    from type in s.GetExportedTypes()
    where !type.IsAbstract
    where typeof(IMyService).IsAssignableFrom(type)
    select type);

container.Verify();

Then I get the following results

// correctly resolves to count of my 4 implementations 
// of IMyService
var myServices = container.GetAllInstances<IMyService>();

// incorrectly resolves IEnumerable<IMyService> to count 
// of 0 IMyServices.
var myFactory = container.GetInstance<IMyFactory>();

Why is it that my factory cannot resolve the collection of services?


Solution

  • I created the following console application:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using SimpleInjector;
    
    public interface IMyManager { }
    public interface IMyFactory { }
    public interface IMyService { }
    
    public class MyManager : IMyManager
    {
        public MyManager(IMyFactory factory) { }
    }
    
    public class MyFactory : IMyFactory
    {
        public MyFactory(
            IEnumerable<IMyService> services)
        {
            Console.WriteLine("MyFactory(Count: {0})",
                services.Count());
        }
    }
    
    public class Service1 : IMyService { }
    public class Service2 : IMyService { }
    public class Service3 : IMyService { }
    public class Service4 : IMyService { }
    
    class Program
    {
        static void Main(string[] args)
        {
            var container = new Container();
    
            container.Register<IMyFactory, MyFactory>(); 
            container.Register<IMyManager, MyManager>(); 
    
            container.RegisterAll<IMyService>(
                from nd in AppDomain.CurrentDomain.GetAssemblies()
                from type in nd.GetExportedTypes()
                where !type.IsAbstract 
                where typeof(IMyService).IsAssignableFrom(type) 
                select type); 
    
            var myManager = container.GetInstance<IMyManager>();
    
            Console.WriteLine("IMyService count: " + 
                container.GetAllInstances<IMyService>().Count());
        }
    }
    

    When I run it, it outputs the following:

    MyFactory(Count: 4) IMyService count: 4