मैं साधारण इंजेक्टर का उपयोग कर रहा हूँ मेरे कोड को ईवेंट बस संदेशों के लिए ऑटो-वायर्ड होने में सक्षम करें। मेरे INotificationHandlers की ऑटो-वायरिंग के दौरान मैंने अलग-अलग जीवन शैली के संभावित उपयोग को विभिन्न ठोस कार्यान्वयन के लिए अनुमति दी है, जैसा कि यहां दिखाया गया है:

public static Lifestyle GetLifestyleForType(
    Type type, Container container, Dictionary<Type,Lifestyle> list = null)
{
    if (list is null) return container.Options.DefaultLifestyle;

    return list.TryGetValue(type, out var lifestyle)
        ? lifestyle : container.Options.DefaultLifestyle;
}

public static void Wire(Container container)
{
    var lifestyles = new Dictionary<Type, Lifestyle> {
        { typeof(FirstClass), Lifestyle.Singleton },
        { typeof(OtherClass), Lifestyle.Transient }
    };

    var handlerTypes = container
        .GetTypesToRegister(typeof(INotificationHandler<>), typeof(OtherClass).Assembly);

    var handlerProducers = (
        from type in handlerTypes
        from interfaceType in type.GetClosedTypesOf(typeof(INotificationHandler<>))
        let producer = GetLifestyleForType(type, container, lifestyles)
            .CreateProducer(interfaceType, type, container)
        group new { type, producer } by interfaceType into interfaceGroup
        select new
        {
            interfaceGroup.Key,
            Value = (
                from pair in interfaceGroup
                group pair.producer by pair.type into concreteGroup
                select new { concreteGroup.Key, Value = concreteGroup.ToArray() })
                .ToDictionary(i => i.Key, i => i.Value)
        }).ToDictionary(i => i.Key, i => i.Value);
}

मैं अन्य सभी ऑटो-वायरिंग उदाहरणों के साथ नोट करता हूं, यह मानता है कि एक ही जीवन शैली का उपयोग किया जाता है (जैसा कि एक निर्दिष्ट नहीं देखा गया है) - इसका कोई कारण (खतरनाक चीजें करने से रोकने के लिए)?

इसके अलावा Lifestyle.Transient async/await ऑपरेटरों के साथ अलग तरह से काम करता है? बस एहसास हुआ कि Transient जीवनचक्र का उपयोग SimpleInjector के साथ-साथ बिना किसी देखे हुए दुष्प्रभाव के किया जा रहा है, जो मुझे पता है, मान लें कि मुझे डिफ़ॉल्ट रूप से स्विच करना चाहिए (जैसा कि मैं ऊपर वायरिंग कर रहा हूं) Lifestyle.Scoped और container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle()

1
morleyc 14 अप्रैल 2020, 22:08

1 उत्तर

सबसे बढ़िया उत्तर

मैं अन्य सभी ऑटो-वायरिंग उदाहरणों के साथ नोट करता हूं, यह मानता है कि एक ही जीवन शैली का उपयोग किया जाता है (जैसा कि एक निर्दिष्ट नहीं देखा गया है) - इसका कोई कारण (खतरनाक चीजें करने से रोकने के लिए)?

डिफ़ॉल्ट रूप से, Simple Injector Transient को अपनी डिफ़ॉल्ट जीवन शैली के रूप में उपयोग करता है। इसका मतलब यह है कि, जब तक आप स्पष्ट रूप से जीवन शैली के साथ पंजीकरण की आपूर्ति नहीं करते हैं, साधारण इंजेक्टर डिफ़ॉल्ट जीवन शैली का उपयोग करता है, अर्थात Transient

यद्यपि आपके संचालकों के लिए कई जीवन शैली का उपयोग करने में कुछ भी गलत नहीं है, कई जीवन शैली का उपयोग करने से आपके समाधान की जटिलता बढ़ जाती है (जैसा कि आपने शायद पहले ही देखा है), इसलिए आपको खुद से पूछना चाहिए कि क्या आपको वास्तव में इस जटिलता की आवश्यकता है। जब तक आप अपने ऑब्जेक्ट ग्राफ़ को ऊपर से नीचे तक सिंगलटन नहीं बनाना चाहते (लेकिन इससे एक पूरी तरह से अलग मॉडल), मेरा सुझाव है कि समाधान को सरल रखें और इसके बजाय Transient का उपयोग करें। अंगूठे के एक सामान्य नियम के रूप में, अपने रूट प्रकार (हैंडलर, कंट्रोलर, व्यू मॉडल, आदि) Transient बनाएं।

हालांकि Transient जीवनशैली कुछ परिणामों के साथ आती है। Transient घटकों का निपटान नहीं किया जाता है, और चूंकि Transient घटकों का पुन: उपयोग नहीं किया जाता है, इसलिए उनका उपयोग डेटा के किसी भी कैशिंग के लिए नहीं किया जा सकता है।

लेकिन निपटान और कैशिंग से संबंधित किसी भी तर्क को जड़ प्रकारों की निर्भरता में स्थानांतरित करके उन समस्याओं को आसानी से हल किया जा सकता है। आप उन निर्भरताओं को Scoped या Singleton भी बना सकते हैं। मैं आमतौर पर सिस्टम में किसी भी हैंडलर पर भौंकता हूं जो IDisposable लागू करता है या आंतरिक रूप से किसी भी राज्य को कैश करता है। उस तर्क को अपने संचालकों से बाहर ले जाना-न केवल- Transient जीवन शैली की सीमाओं के आसपास 'काम करता है', मैं तर्क दूंगा कि यह एक बेहतर-डिज़ाइन की गई प्रणाली की ओर ले जाता है। यह आपके संचालकों के बारे में तर्क करना भी आसान बनाता है; वे क्या कर सकते हैं और क्या नहीं, और उनकी जीवनशैली क्या है। सिस्टम पर काम करने वाले किसी भी डेवलपर (और भविष्य के किसी भी डेवलपर) के लिए समझने की सबसे आसान बात यह है कि जब सभी हैंडलर की जीवन शैली हमेशा समान होती है।

इसके अलावा Lifestyle.Transient async/प्रतीक्षा ऑपरेटरों के साथ अलग तरह से काम करता है?

Transient जीवन शैली वहां की सबसे सरल जीवन शैली है; साधारण इंजेक्टर के लिए Transient सिर्फ एक नो-ऑप है। इंस्टेंस बनाया जाता है और इसके बारे में भुला दिया जाता है (इसे ट्रैक नहीं किया जाता है)। एसिंक्रोनस ऑपरेशन में चलते समय यह कोई अलग काम नहीं करेगा।

1
Steven 15 अप्रैल 2020, 12:32