2013-03-14 9 views
15

का उपयोग कर ऑटोफैक प्रतिनिधि कारखाना मैं ऑटोफैक के साथ प्रतिनिधि कारखाने पैटर्न को समझने की कोशिश कर रहा हूं। मुझे पता है कि IIndex <> बंद() पंजीकरण, जो यहाँ में अच्छी तरह से समझाया गया है के साथ का उपयोग कर कारखाना लागू करने के लिए: Configuring an Autofac delegate factory that's defined on an abstract classfunc <>

मुझे पता है कि अगर मैं समारोह <> का उपयोग कर एक कारखाने बना सकते हैं चाहते हैं, और मैं कैसे करेंगे निम्न नमूना के लिए पंजीकरण:

public enum Service 
{ 
    Foo, 
    Bar 
} 

public interface FooService : IService 
{ 
    ServiceMethod(); 
} 

public interface BarService : IService 
{ 
    ServiceMethod(); 
} 

public class FooBarClient 
{ 
    private readonly IService service; 

    public FooBarClient(Func<Service, IService> service) 
    { 
     this.service = service(Service.Foo); 
    } 

    public void Process() 
    { 
     service.ServiceMethod(); // call the foo service. 
    } 
} 
+0

तुम सिर्फ क्यों उपयोग नहीं करते 'IIndex <>' 'keyed()' के साथ? Autofac आपके लिए यह 'Func <सेवा, IService>' नहीं बना सकता है। आपको 'कंटेनर()' या 'नामांकित()' का उपयोग करने के साथ अपने कंटेनर में पंजीकरण करने की आवश्यकता है: 'बिल्डर। रजिस्ट्रार > (सी => एस => सी। रेसोल्वकेड (ओं)); 'प्रतिनिधि कारखाने केवल पैरामीटर के साथ एक प्रकार बना सकते हैं और पैरामीटर के आधार पर एक प्रकार का चयन नहीं कर सकते क्योंकि यह' IIndex <> 'है। – nemesv

+2

IIndex के लिए <> मुझे ऑटोफैक लाइब्रेरी का संदर्भ देने की आवश्यकता होगी जिसे मैं टालने का प्रयास कर रहा हूं। मैं चाहता हूं कि मेरा डीआई कोड समग्र रूट (अलग पुस्तकालय) में हो, यदि संभव हो तो। –

उत्तर

16

Autofac जो आपको एक पैरामीटर के आधार पर विभिन्न प्रकार के लौटने की सुविधा देता है आप के लिए यह Func<Service, IService> का निर्माण नहीं कर सकते। यह IIndex<> है।

हालांकि अगर आप नहीं चाहते/IIndex<> उपयोग नहीं कर सकते तो आप इस कारखाने समारोह Keyed या Named की मदद से बना सकते हैं और कंटेनर में अपने कारखाने पंजीकृत कर सकते हैं:

var builder = new ContainerBuilder(); 
builder.RegisterType<FooBarClient>().AsSelf(); 
builder.RegisterType<FooService>().Keyed<IService>(Service.Foo); 
builder.RegisterType<BarService>().Keyed<IService>(Service.Bar); 

builder.Register<Func<Service, IService>>(c => 
{ 
    var context = c.Resolve<IComponentContext>(); 
    return s => context.ResolveKeyed<IService>(s); 
}); 
+0

धन्यवाद nemesv! यह उम्मीद के रूप में काम कर रहा है !!! एक सवाल, क्या प्रदर्शन में कोई अंतर होगा - IIndex बनाम Func? –

+0

मुझे नहीं पता कि IIndex कैसे कार्यान्वित किया जाता है और किस तरह का चचिंग या प्रदर्शन अनुकूलन है। आप इम्प्लांटेशन की जांच कर सकते हैं या आपको दो की तुलना करने के लिए अपने परिदृश्य के लिए बनाए गए प्रदर्शन परीक्षणों की आवश्यकता है। – nemesv

+2

मैंने अभी कारण संस्करण के साथ कोशिश की है, लेकिन यह मुझे 'ऑब्जेक्ट डिस्प्ले अपवाद' देता है ... मैंने प्रतिनिधियों के अंदर 'नया फू' कॉल करके इसे हल किया है (जो एक बायिग नोगो है!) –

संबंधित मुद्दे