Использовать именованную регистрацию в autofac с интеграцией внедрения контроллера MVC - PullRequest
11 голосов
/ 02 марта 2012

Я настроил автозапуск для внедрения зависимостей моих контроллеров MVC asp.net, например:

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

И все работает нормально. Однако у меня есть несколько реализаций интерфейса (скажем, IFoo), которые я хочу зарегистрировать как именованные экземпляры:

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

И у меня есть несколько контроллеров, которые принимают IFoo в своем конструкторе. Но каждому контроллеру нужна конкретная реализация IFoo. Как я могу сказать autofac, какой контроллер нуждается в "bar", а какой - в "baz"?

1 Ответ

22 голосов
/ 02 марта 2012

Вы можете зарегистрировать (фактически перерегистрировать, если вы используете builder.RegisterControllers()) свои контроллеры с параметром , который будет использоваться при разрешении:

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

Если контроллер нуждаетсякратный IFoo вы можете указать параметр разрешения, например, с именем (с немного дополнительным синтаксисом, но вы можете скрыть его за методом расширения):

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)
    {
         //...
    }
}
...