2012-03-01 57 views
11

autofac命名註冊使用我autofac設置做我的asp.net MVC控制器的依賴注入,像這樣:與MVC控制器注塑一體化

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」?

回答

22

你可以註冊(如果您正在使用builder.RegisterControllers()實際上重新註冊)與parameter你的控制器,這將解決過程中使用:

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

謝謝,這是有效的。偶爾一個控制器需要多個'IFoo' - 我可以指定哪個參數名稱指向哪個命名實現? – 2012-03-02 19:12:22

+0

我已經更新了我的答案。 – nemesv 2012-03-02 20:20:27