For current versions of Autofac: (2.0+, so all you have to use today)
You register several ILoggers (for example):
var builder = new ContainerBuilder(); builder.Register<ConsoleLogger>() .As<ILogger>(); builder.Register<EmailLogger>() .As<ILogger>() .PreserveExistingDefaults();
Then we get all ILogger s:
var loggers = container.Resolve<IEnumerable<ILogger>>();
You do not need to do anything, just ask the IEnumerable<T> type you want. Autofac has collector support out of the box, as well as other adapters that can complement your components with additional features.
This is the same use as the pre-2.x ImplicitCollectionSupportModule, but baked directly.
For older versions (0.X - 1.4)
Two ways:
1) Use collection registration
var builder = new ContainerBuilder(); builder.RegisterCollection<ILogger>() .As<IEnumerable<ILogger>>(); builder.Register<ConsoleLogger>() .As<ILogger>() .MemberOf<IEnumerable<ILogger>>(); builder.Register<EmailLogger>() .As<ILogger>() .MemberOf<IEnumerable<ILogger>>();
Then:
var loggers = container.Resolve<IEnumerable<ILogger>>();
which gives you IEnumerable.
or 2) You can use the ImplicitCollectionSupport module, which will make the code work like newer versions of Autofac:
builder.RegisterModule(new ImplicitCollectionSupportModule()); builder.Register(component1).As<ILogger>; builder.Register(component2).As<ILogger>;
Then enable the ILogger collection instead of finding a solution.
var loggers = container.Resolve<IEnumerable<ILogger>>();
which again gives you IEnumerable.
Philip Rieck Sep 10 '09 at 16:03 2009-09-10 16:03
source share