在autofac中使用命名注册与MVC控制器注入集成

Gab*_*art 11 asp.net-mvc autofac

我有autofac设置来执行我的asp.net MVC控制器的依赖注入,如下所示:

System.Web.Mvc.DependencyResolver
                   .SetResolver(new AutofacDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)

它工作正常.但是,我有几个接口(比方说IFoo)的实现,我想注册为命名实例:

builder.Register<Bar>(c => new Bar()).Named<IFoo>("bar");
builder.Register<Baz>(c => new Baz()).Named<IFoo>("baz");
...
Run Code Online (Sandbox Code Playgroud)

我有几个控制器,IFoo他们的构造函数.但是每个控制器都需要不同的具体实现IFoo.我怎么能告诉autofac哪个控制器需要"bar"哪个需要"baz"?

nem*_*esv 22

您可以使用将在解析期间builder.RegisterControllers()使用的参数注册(实际上重新注册,如果您正在使用)您的控制器:

builder.RegisterType<SomeController>()
       .WithParameter(ResolvedParameter.ForNamed<IFoo>("bar"));
builder.RegisterType<OtherController>()
       .WithParameter(ResolvedParameter.ForNamed<IFoo>("baz"));
Run Code Online (Sandbox Code Playgroud)

如果控制器需要多个,IFoo您可以指定resolve参数,例如使用名称(使用一些额外的语法,但您可以将其隐藏在扩展方法后面):

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)
    {
         //...
    }
}
Run Code Online (Sandbox Code Playgroud)