2011-01-07 13 views
5

मान लें कि हमारे पास फर्स्टबार और सेकेंडबार द्वारा लागू फू और आईबार द्वारा लागू IFoo है।कैसल विंडसर: विशिष्ट कार्यान्वयन के साथ सम्मेलन पंजीकरण का उपयोग

container.Register(
    AllTypes.FromThisAssembly().Pick() 
     .WithService.DefaultInterface()) 

हम कंटेनर में तीन प्रविष्टियों होगा:

इस सम्मेलन पंजीकरण का उपयोग

IFoo = Foo 
IBar = FirstBar 
IBar = SecondBar 

अब, हम इस पंजीकरण कैसे tweak कंटेनर बताने के लिए सक्षम होने के लिए कर सकते हैं कि के लिए इबार हम चाहते हैं कि द्वितीयबार केवल पंजीकृत हो? क्रमबद्ध करें:

container.Register(
    AllTypes.FromThisAssembly().Pick() 
     .WithService.DefaultInterface() 
     .For<IBar>().Select<SecondBar>()) 

केस का उपयोग करें: हमारे पास हमारे ऐप में बहुत सारी सेवाएं सम्मेलनों द्वारा पंजीकृत हैं। हालांकि, कुछ सेवा इंटरफेस में दो या दो से अधिक कार्यान्वयन होते हैं (जैसे वास्तविक कार्यान्वयन, नकली कार्यान्वयन और परीक्षण कार्यान्वयन)। कन्वेंशन पंजीकरण उन सभी को एक ही इंटरफ़ेस के तहत पंजीकृत करेगा और इंटरफ़ेस को हल करते समय हमें पहला कार्यान्वयन (नोडेटर्मिनिस्टिक ऑर्डर में) मिलेगा। हम पंजीकरण करते समय उन सेवाओं के लिए एक विशिष्ट कार्यान्वयन का चयन करने में सक्षम होना चाहते हैं। हम वह कैसे कर सकते है?

उत्तर

3

यह वही काम किया जाता है:

container.Register(
    AllTypes.FromThisAssembly().Pick() 
     .WithService.DefaultInterface()) 
     .ConfigureFor<IBar>(c => 
      c.If((k, m) => m.Implementation == typeof(SecondBar))); 

यह प्रभावी रूप से Ibar सेवा के लिए केवल SecondBar impl पंजीकृत करता है। इस तरह, यदि दी गई सेवा के लिए एक से अधिक कार्यान्वयन हैं, तो हम पारंपरिक स्कैनर को बता सकते हैं जो हम चाहते हैं।

हम आगे चला गया और इस उद्देश्य के लिए अच्छी छोटी विस्तार तरीकों बनाया:

public static BasedOnDescriptor Select<TService, TImpl>(this BasedOnDescriptor desc) 
{ 
    return desc.ConfigureFor<TService>(c => c.If((k, m) => m.Implementation == typeof(TImpl))); 
} 

public static BasedOnDescriptor Ignore<TService>(this BasedOnDescriptor desc) 
{ 
    return desc.ConfigureFor<TService>(c => c.If((k, m) => false)); 
} 

अब हम इसे इस तरह उपयोग कर सकते हैं:

container.Register(
    AllTypes.FromThisAssembly().Pick() 
     .WithService.DefaultInterface()) 
     .Select<IBar, SecondBar>() 
     .Ignore<ISomeService>() 

सभी यह सब में अच्छी तरह से काम करता है। मेरा मानना ​​है कि उन दो तरीकों से कैसल में हो सकता है। विन्डोजर उचित है। @ Krzysztof Koźmic: मैं पैच कहां जमा करूं? :)

+0

गिथब। पहली बार फीडबैक इकट्ठा करने के लिए Google समूह पर महल उपयोगकर्ता समूह पर इसे लाने का अच्छा विचार हो सकता है। चीयर्स –

+0

हां, अनदेखा बिल्कुल वही है जो मुझे चाहिए – PandaWood

5

अपने सम्मेलन को मजबूत करें। यह स्पष्ट रूप से चौड़ा है।

container.Register(
    AllTypes.FromThisAssembly() 
     .Where(t => t.Namespace != "Acme.Tests") 
     .WithService.DefaultInterface()) 
संबंधित मुद्दे