2010-01-25 12 views
5

के साथ जुड़े हुए मेरी रजिस्ट्री में प्रकारों पर जीवन चक्र स्थापित करने के लिए मैंStructureMap: कैसे ConnectImplementationsToTypesClosing

Scan(scanner => 
     { 
      scanner.AssemblyContainingType<EmailValidation>(); 
      scanner.ConnectImplementationsToTypesClosing(typeof(IValidation<>)); 
     }); 

क्या मैं इन सब Singletons के रूप में परिभाषित करने के लिए क्या करना चाहिए है?

साथ ही इस प्रश्न के अलावा, क्या स्ट्रक्चर मैप में पंजीकृत एक सिंगलटन ऑब्जेक्ट के रूप में स्टेटलेस रहित सब कुछ परिभाषित करने का कोई कारण नहीं है?

उत्तर

11

केविन का उत्तर 2.5.4 और पुराने संस्करणों के लिए सही है। वर्तमान StructureMap ट्रंक (और जब 2.5.5+ जारी किया गया है), अब आप कर सकते हैं:

Scan(scanner => 
{ 
    scanner.AssemblyContainingType<EmailValidation>(); 
    scanner.ConnectImplementationsToTypesClosing(typeof(IValidation<>)) 
      .OnAddedPluginTypes(t => t.Singleton()); 
}); 
+0

बहुत अच्छा जोड़ा गया विशेष रुप से प्रदर्शित, 2.5.5 के लिए इंतजार नहीं कर सकता! –

+0

वर्तमान समय के साथ लाइन में अधिक होने के लिए इसका उत्तर स्विच किया गया। –

1

असेंबली स्कैनर विधि कनेक्टइम्प्लिमेंटेशन टोटीप्स क्लोजिंग काम करने के लिए एक आईआरजीस्ट्रेशन कॉन्फ़्रेंस का उपयोग करता है। ऐसा करने के लिए मैंने एक स्कोप लेने के लिए स्ट्रक्चर मैप जेनेरिक कनेक्शन स्कैनर की प्रतिलिपि बनाई और अद्यतन किया। इसके बाद मैंने इसे संभालने के लिए वाक्य रचनात्मक चीनी के रूप में उपयोग करने के लिए एक आसान असेंबली स्कैनर एक्सटेंशन विधि बनाई।

public class GenericConnectionScannerWithScope : IRegistrationConvention 
{ 
    private readonly Type _openType; 
    private readonly InstanceScope _instanceScope; 

    public GenericConnectionScannerWithScope(Type openType, InstanceScope instanceScope) 
    { 
     _openType = openType; 
     _instanceScope = instanceScope; 

     if (!_openType.IsOpenGeneric()) 
     { 
      throw new ApplicationException("This scanning convention can only be used with open generic types"); 
     } 
    } 

    public void Process(Type type, Registry registry) 
    { 
     Type interfaceType = type.FindInterfaceThatCloses(_openType); 
     if (interfaceType != null) 
     { 
      registry.For(interfaceType).LifecycleIs(_instanceScope).Add(type); 
     } 
    } 
} 

public static class StructureMapConfigurationExtensions 
{ 
    public static void ConnectImplementationsToSingletonTypesClosing(this IAssemblyScanner assemblyScanner, Type openGenericType) 
    { 
     assemblyScanner.With(new GenericConnectionScannerWithScope(openGenericType, InstanceScope.Singleton)); 
    } 
} 

यहां उचित सेटअप कोड है।

Scan(scanner => 
    { 
     scanner.ConnectImplementationsToSingletonTypesClosing(typeof(IValidation<>)); 
    }); 

उम्मीद है कि इससे मदद मिलती है।

+0

यह निश्चित रूप से एक समाधान की तरह दिखता है, यह इस इतना आसान कुछ के लिए किया जाना चाहिए लेकिन यह बहुत समान दिखता है गूंगा है एक पोस्ट में मैंने एसएम समूह पर पहले देखा था कि मुझे लगता है कि जेरेमी यह निर्दिष्ट करने के लिए एक तरीका जोड़ रहा है कि 2.5.5 में अपने स्वयं के सम्मेलन को लागू करने की आवश्यकता के बिना और अब आपकी पोस्ट को देखते हुए यह बहुत समझ में आता है कि यह क्या था। –

+0

क्षमा करें उस पोस्ट को नहीं देखा। मैं जेरेमी के साथ काम करता हूं। मेरा समाधान बनाने के लिए मैंने अभी स्ट्रक्चर मैप स्रोत को पकड़ लिया और यह पता लगाया कि वह यह कैसे कर रहा था और इसे आपके अनुरोध के अनुसार अनुकूलित किया। यह एसएम कॉन्फ़िगरेशन डीएसएल के साथ कुछ और लचीलापन या बेहतर एकीकरण से लाभ हो सकता है लेकिन यह आपको अभी के लिए जा रहा है। का आनंद लें। – KevM

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