Autofac implicitly supports this by default via the use of IEnumerable<T>. Instead of having your depending class’s constructor take in a single instance of T, you make it take in an instance of IEnumerable<T> that will contain every T registered:
public interface IMessageHandler
{
void HandleMessage(Message m);
}
public class MessageProcessor
{
private IEnumerable<IMessageHandler> _handlers;
public MessageProcessor(IEnumerable<IMessageHandler> handlers)
{
_handlers = handlers;
}
public void ProcessMessage(Message m)
{
foreach (var handler in _handlers)
{
handler.HandleMessage(m);
}
}
}
Then in your registration, simply add multiple implementations of T:
var builder = new ContainerBuilder();
builder.RegisterType<FirstHandler>().As<IMessageHandler>();
builder.RegisterType<SecondHandler>().As<IMessageHandler>();
builder.RegisterType<ThirdHandler>().As<IMessageHandler>();
builder.RegisterType<MessageProcessor>();
When MessageProcessor is instantiated, the IEnumerable it receives will contain three items as per the above registrations against IMessageHandler.
You can read more about this on my blog.