यह भी गुस्सा हो रहा है - यह DRY नहीं है
यह सच है। लेकिन वहाँ केवल इतना है कि आप एक क्रॉस-कटिंग चिंता के लिए कर सकते हैं जो आपके पास हर प्रकार से व्याप्त है। आपको हर जगह लकड़हारे का उपयोग करना होगा, इसलिए आपके पास उन प्रकारों पर संपत्ति होनी चाहिए।
तो देखते हैं कि हम इसके बारे में क्या कर सकते हैं।
एकाकी वस्तु
सिंगलनेट भयानक हैं <flame-suit-on>
।
जैसा कि आपने अपने दूसरे उदाहरण के साथ किया है, मैं संपत्ति इंजेक्शन के साथ चिपके रहने की सलाह देता हूं। यह सबसे अच्छा फैक्टरिंग है जो आप जादू का सहारा लिए बिना कर सकते हैं। एक सिंगलटन के माध्यम से इसे छिपाने के लिए एक स्पष्ट निर्भरता होना बेहतर है।
लेकिन अगर सिंगलेट्स आपके लिए महत्वपूर्ण समय बचाते हैं, जिसमें सभी रिफैक्टिंग शामिल हैं, तो आपको कभी भी (क्रिस्टल बॉल टाइम!) करना होगा, मुझे लगता है कि आप उनके साथ रह सकते हैं। यदि कभी एक सिंगलटन के लिए उपयोग किया गया था, तो यह हो सकता है। लागत को ध्यान में रखें यदि आप कभी भी अपना मन बदलना चाहते हैं तो यह जितना हो सके उतना अधिक होगा।
यदि आप ऐसा करते हैं, तो का उपयोग कर अन्य लोगों के उत्तर देखें पैटर्न (विवरण देखें), और एक (resetable) सिंगलटन दर्ज की उन कारखाने के बजाय एक सिंगलटन लकड़हारा उदाहरण।Registry
ऐसे अन्य विकल्प हैं जो बिना किसी समझौते के बस काम कर सकते हैं, इसलिए आपको पहले उनकी जांच करनी चाहिए।
विजुअल स्टूडियो कोड स्निपेट
आप उस दोहराए गए कोड के प्रवेश को तेज करने के लिए विज़ुअल स्टूडियो कोड स्निपेट्स का उपयोग कर सकते हैं । आप कुछ टाइप करने में सक्षम होंगे logger
tab, और कोड जादुई रूप से आपके लिए दिखाई देगा।
बंद करने के लिए AOP का उपयोग करना
आप आस्पेक्ट ओरिएंटेड प्रोग्रामिंग (AOP) फ्रेमवर्क जैसे PostSharp जैसे कुछ को ऑटो-जेनरेट करने के लिए उस प्रॉपर्टी इंजेक्शन कोड को थोड़ा खत्म कर सकते हैं ।
ऐसा कुछ ऐसा हो सकता है जब आप कर रहे हों:
[InjectedLogger]
public ILogger Logger { get; set; }
आप विधि विधि अनुरेखण नमूना कोड का उपयोग भी स्वचालित रूप से विधि प्रवेश और निकास कोड का पता लगाने के लिए कर सकते हैं, जो सभी लकड़हारा गुणों को एक साथ जोड़ने की आवश्यकता को समाप्त कर सकता है। आप एक वर्ग स्तर पर विशेषता लागू कर सकते हैं, या नाम स्थान चौड़ा:
[Trace]
public class MyClass
{
}
#if DEBUG
[assembly: Trace( AttributeTargetTypes = "MyNamespace.*",
AttributeTargetTypeAttributes = MulticastAttributes.Public,
AttributeTargetMemberAttributes = MulticastAttributes.Public )]
#endif