Registering implementations of base class with Autofac to pass in via IEnumerable
autofac, c#, dependency-injection, inversion-of-control
Solution
You are missing the `As<Animal>()` call in your registration.
Without it Autofac will register your types with the default `AsSelf()` setting so you won't get your classes if you ask for base type with `IEnumerable<Animal>` only if you use the sub-types like Dog and Cat.
So change your registration to:
builder.RegisterAssemblyTypes(typeof(Animal).Assembly)
.Where(t => t.IsSubclassOf(typeof(Animal)))
.As<Animal>();
Problem
I have a base class, and a series of other classes inheriting from this: (Please excuse the over-used animal analogy) public abstract class Animal { } public class Dog : Animal { } public class Cat : Animal { } I then have a class that has a dependancy on an `IEnumerable<Animal>` ``` public class AnimalFeeder { private readonly IEnumerable<Animal> _animals; public AnimalFeeder(IEnumerable<Animal> animals ) { _animals = animals; } } ``` If I manually do something like this: ``` var animals = typeof(Animal).Assembly.GetTypes() .Where(x => x.IsSubclassOf(typeof(Animal))) .ToList(); ``` Then I can see that this returns `Dog` and `Cat` However, when I try to wire up my Autofac like this: ``` builder.RegisterAssemblyTypes(typeof(Animal).Assembly) .Where(t => t.IsSubclassOf(typeof(Animal))); builder.RegisterType<AnimalFeeder>(); ``` When `AnimalFeeder` is instantiated, there are no `Animal` passed in to the constructor. Have I missed something?