15

I have autofac set up to do dependency injection of my asp.net MVC controllers, like so:

System.Web.Mvc.DependencyResolver
                   .SetResolver(new AutofacDependencyResolver(container));

And it is working fine. However, I have several implementations of an interface (say, IFoo) that I want to register as named instances:

builder.Register<Bar>(c => new Bar()).Named<IFoo>("bar");
builder.Register<Baz>(c => new Baz()).Named<IFoo>("baz");
...

And I have several controllers which take an IFoo in their constructor. But each controller needs a different concrete implementation of IFoo. How can I tell autofac which controller needs "bar" and which needs "baz"?

gideon
  • 19,329
  • 11
  • 72
  • 113
Gabe Moothart
  • 31,211
  • 14
  • 77
  • 99

1 Answers1

27

You can register (actually re-register if you are using builder.RegisterControllers()) your controllers with the parameter which will be used during resolve:

builder.RegisterType<SomeController>()
       .WithParameter(ResolvedParameter.ForNamed<IFoo>("bar"));
builder.RegisterType<OtherController>()
       .WithParameter(ResolvedParameter.ForNamed<IFoo>("baz"));

If a controller needs multiple IFoo you can specify the resolve parameter e.g. with name (with a little bit extra syntax, but you can hide it behind an extension method):

builder.RegisterType<ComplexController>().WithParameters(new [] {
 new ResolvedParameter((p,c) => p.Name == "bar",(p,c) => c.ResolveNamed<IFoo>("bar")),
 new ResolvedParameter((p,c) => p.Name == "baz",(p,c) => c.ResolveNamed<IFoo>("baz"))
});

public class ComplexController: Controller
{
    public ComplexController(IFoo baz, IFoo bar)
    {
         //...
    }
}
nemesv
  • 138,284
  • 16
  • 416
  • 359
  • Thanks, that works. Occasionally a controller will need more than one `IFoo` - can I specify which parameter name goes to which named implementation? – Gabe Moothart Mar 02 '12 at 19:12