2012-03-01 6 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 के एक अलग ठोस कार्यान्वयन की आवश्यकता होती है। मैं ऑटोफैक कैसे बता सकता हूं कि नियंत्रक को "बार" की आवश्यकता है और किसके लिए "बाज़" की आवश्यकता है?

उत्तर

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' की आवश्यकता होगी - क्या मैं निर्दिष्ट कर सकता हूं कि कौन सा पैरामीटर नाम कार्यान्वित किया गया है? –

+0

मैंने अपना जवाब अपडेट कर दिया है। – nemesv