c# - How to conventionally set the LifeTimeManagement in a UnityContainer? -
मेरे ऐप में, मैं मैसेंजर अंतरफलक IMessagePublisher & lt; T & gt; एक सामान्य प्राप्ति वर्ग में < कोड> SimpleMessenger & LT; टी & gt; । एक ही प्रकार
T के लिए, एक होना चाहिए और केवल एक
SimpleMessenger उदाहरण होना चाहिए
ContainerControlledLifetimeManaged संभव अपवाद के बिना। < p> मैं RegisterTypes का उपयोग automaticaly मेरी registerations के सबसे करने के लिए:
unityContainer.RegisterTypes (AllClasses.FromAssembliesInBasePath (), WithMappings.FromAllInterfacesInSameAssembly, WithName.Default, WithLifetime.None, अशक्त, सच); और मेरे महान आश्चर्य की बात है, यह प्रतीत होता है कि कंटेनर अपने सभी साधारण संदेशवाहकों को स्वचालित रूप से पंजीकृत करने का प्रबंधन करता है! अप्रत्याशित रूप से, यह संभवतः एक अच्छी खबर है यही है, अगर मैं अपने सभी आईएमसेज पब्लिशर प्राप्तियों के लिए जीवन भर को कंटेनर कंट्रोलेड लाइफटाइम मैनेजमेंट के लिए पारंपरिक रूप से सेट करने का प्रबंधन करता हूं।
कुछ शब्दों में, मैं अपने कंटेनर में एक "पंजीकरण रणनीति "जो कुछ ऐसा कहना होगा
अगर (somehowObtainedTypeToRegister.GetGenericTypeDefinition () == typeof (IMessageListener & LT; वस्तु & gt;।) GetGenericTypeDefinition ()) {एक तरह से सेट // या इस प्रकार के लिए एक और ContainerControlledLifetimeManagement } लेकिन मुझे यह नहीं पता कि यह कैसे करना है। मैं पहले से ही UnityContainerExtension का उपयोग कर रहा हूं, लेकिन यह केवल रद्दीकरण समय पर उपयोगी साबित होता है, पंजीकरण समय पर नहीं। क्या यह हासिल करने का कोई तरीका है?
मैप करने का सबसे आसान तरीका यह दो बार करना होगा, जैसे:
पहले सभी मैपिंग को पंजीकृत करें जैसा आपने पहले किया था t.GetInterfaces;
unityContainer.RegisterTypes (AllClasses.FromAssembliesInBasePath () .Where (टी = & gt: तो फिर सभी आइटम जहां द्वारा ContainerControlledLifetimeManager नियंत्रित किया जा करना चाहते हैं ओवरराइड ()। कोई भी (i = & gt; i.IsGenericType & amp; i.GetGenericTypeDefinition () == प्रकार (IMessageListener & lt; & gt;)), WithMappings.FromAllInterfacesInSameAssembly, WithName.Default, WithLifeetimeContainerControlled, रिक्त, सच);
Comments
Post a Comment