2009-05-06 14 views
6

मेरे कोड में, मैं निम्नलिखित वस्तुओं है:वस्तुओं के बीच परिपत्र निर्भरताओं को संभालने का सबसे अच्छा तरीका क्या है?

  • ErrorManager - नियंत्रण कैसे त्रुटियों आवेदन
  • ConfigManager में लॉग इन कर रहे हैं - नियंत्रण कैसे कॉन्फ़िगरेशन जानकारी प्राप्त की है

पर जिस परियोजना पर मैं काम कर रहा हूं, ErrorManager को ConfigManager इंस्टेंस का उपयोग करके कॉन्फ़िगरेशन जानकारी खींचने की आवश्यकता है, जबकि ConfigManager त्रुटि मैनेजर का उपयोग करता है, त्रुटि उत्पन्न होती है।

ErrorManager _errorManager = new CustomErrorManager(); 
ConfigManager _configManager = new CustomConfigManager(_errorManager); 
_errorManager.SetConfigurationManager(_configManager); 

वहाँ एक रास्ता मुझे निर्भरता के इस परिपत्र संदर्भ को साफ करने के लिए है:

पल में, मैं कोड में निम्नलिखित कर रहा हूँ?

+2

आमतौर पर "प्रबंधक" वर्गों की एक बहुतायत सिंगलटन पैटर्न के दुरुपयोग को इंगित करती है और उचित रूप से ऑब्जेक्ट उन्मुख डिजाइन नहीं। – Tmdean

+1

मैं एप्लिकेशन में विशिष्ट जिम्मेदारियों के लिए सिंगलटन पैटर्न का उपयोग कर रहा हूं (यानी त्रुटि प्रबंधन और कॉन्फ़िगरेशन प्रबंधन)। एकल उदाहरण फैक्टरी पैटर्न के माध्यम से लागू नहीं किया गया है क्योंकि मैं संभवतः निकट भविष्य में एक आईओसी कंटेनर को मेरे लिए निर्भरताओं को संभालने के लिए आवेदन में जोड़ रहा हूं। अभी, मैं केवल निर्भरताओं को काम करने पर ध्यान केंद्रित कर रहा हूं ताकि आईओसी कंटेनर एक आसान जोड़ होगा। – JamesEggers

उत्तर

3

मैं निम्नलिखित बनाना होगा:

ErrorConfig _errorConfig = ...; 
// ErrorConfig is a new config object containing only ErrorManager Configuration 
ErrorManager _errorManager = new CustomErrorManager(_errorConfig); 
ConfigManager _configManager = new CustomConfigManager(_errorManager); 

अब, ConfigManager उपयोग कर सकते हैं कर सकते हैं रेडी-टू-चलाने के एक बूटस्ट्रैपिंग समस्या जहां ErrorManager त्रुटियों को संभालने के लिए तैयार नहीं है बिना ErrorManager।

2

सर्कुलर संदर्भ आमतौर पर एक तीसरी कक्षा को दोबारा सुधारकर साफ किया जाता है जो दोनों निर्भर करता है। उदाहरण के लिए, आपके पास ऐसा कुछ हो सकता है:

BootstrapConfigManager _bcm = new BootstrapConfigManager(); 
ErrorManager _errorManager = new CustomErrorManager(_bcm); 
ConfigManager _configManager = new CustomConfigManager(_bcm, _errorManager); 
0

अपना कोड रीफैक्टर करें। आप कक्षाओं को तोड़ने के लिए संभवतः कक्षा को तोड़ सकते हैं जिसे आप पहले शुरू कर सकते हैं और दोनों वर्गों को पास कर सकते हैं।

0

मैं पैरामीटर के रूप में अन्य ऑब्जेक्ट में गुजरने वाले प्रत्येक AddRelationship नामक एक्सटेंशन विधियों का निर्माण करूंगा।

वस्तु पारित कर दिया संबंध जोड़ने और फिर दूसरे के AddRelationship विधि कहेंगे:

static void AddRelationship(this ConfigManager configMgr, ErrorManager errMgr) 
{ 
    this.ErrorManager = errMgr; 
    if (this != errMgr.ConfigManager) 
     errMgr.AddRelationship(this); 
} 

static void AddRelationship(this ErrorManager errMgr, ConfigManager configMgr) 
{ 
    this.ConfigManager = configMgr; 
    if (this != configManager.errMgr) 
     configMgr.AddRelationship(this); 
} 

आप या तो वस्तु का उपयोग कर रिश्ता जोड़ सकते हैं कि इसका मतलब यह है।

ConfigManager cfg = new ConfigManager(); 
ErrorManager err = new ErrorManager(); 
//Assign using either: 
err.AddRelationship(cfg); 
//Or 
cfg.AddRelationship(err); 

आपको RemoveRelationship एक्सटेंशन भी बनाना चाहिए।

static void RemoveRelationship(this ConfigManager configMgr, ErrorManager errMgr) 
{ 
    if (this.errorManager == errMgr) 
    { 
     this.errorManager = null; 
     if (errManager.configManager == this) 
      errMgr.RemoveRelationship(this); 
    } 
} 

static void RemoveRelationship(this ErrorManager errMgr, ConfigManager cfgMgr) 
{ 
    if (this.ConfigManager == cfgMgr) 
    { 
     this.configManager = null; 
     if (cfgMgr.errorManager == this) 
      cfgMgr.RemoveRelationship(this); 
    } 
} 

मैं नहीं जानता कि वृत्तीय संदर्भ एक विशेष रूप से अच्छा कोडन अभ्यास कर रहे हैं, लेकिन जैसा कि इस सवाल पूछा हल करना चाहिए।

+0

हालांकि यह एक संभावित समाधान के रूप में काम करेगा, यह एक आईओसी कंटेनर दृष्टिकोण से काम नहीं करेगा जो मैं बता सकता हूं; हालांकि, मैं अभी भी दो अलग-अलग आईओसी कंटेनरों को सीखने की प्रक्रिया में हूं इसलिए मैं गलत हो सकता था। – JamesEggers

+0

आह, आपने यह निर्दिष्ट नहीं किया है कि आपके मूल प्रश्न में या मैंने पोस्ट नहीं किया होगा। मेरे पास अभी तक अन्य परियोजना आवश्यकताओं के कारण आईओसी कंटेनर या निर्भरता इंजेक्शन की जांच करने का समय नहीं है। – BenAlabaster

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

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