2009-08-23 16 views
10

मैं निम्नलिखित स्थिति है:परिपत्र संदर्भ परियोजनाओं

  1. एक परियोजना MyCompany.MyProject.Domain जो मेरे डोमेन मॉडल, और आंशिक वर्गों (जैसे Contact के रूप में) में शामिल है।

  2. मैं एक संपत्ति Slug जो मुझे प्रथम और अंतिम नाम का एक सरल यूआरएल अनुकूल पाठ प्रतिनिधित्व दे देंगे के साथ 'का विस्तार' करने के लिए अपने Contact वर्ग (आंशिक वर्ग, नहीं विस्तार विधि द्वारा) चाहते हैं।

  3. मैं अपने Utility परियोजना MyCompany.MyProject.Utilities जो वास्तव में क्या मैं 2 में चाहते हैं) करता है में एक स्ट्रिंग विस्तार विधि ToSlug() है।

  4. समस्या: मेरे Utility परियोजना पहले से ही मेरे Domain परियोजना जिसका मतलब है कि मैं Domain परियोजना वृत्तीय संदर्भ पैदा करने के बिना Utility परियोजना की ToSlug() विधि को देखने के लिए नहीं मिल सकता है संदर्भित कर रहा है।

मैं इस को हल करने के एक अन्य परियोजना बनाने के लिए उत्सुक नहीं हूँ, और मैं वास्तव में Slug तर्क साझा रखना चाहते हैं।

मैं इसे कैसे हल कर सकता हूं? डोमेन परियोजना के लिए

+1

क्या 'स्लग' एक उचित नाम है? मन उस नाम का उपयोग करने के पीछे तर्क पर विस्तार कर रहा है? इसका क्या मतलब है? –

+0

इस प्रश्न के यूआरएल में 'परिपत्र-संदर्भ-समस्या-सी' भाग (http://stackoverflow.com/questions/1318123/circular-reference-problem-c) को स्लग कहा जाता है। यह मूल रूप से एक वेब अनुप्रयोग में एक इकाई/एंडपॉइंट संदर्भित यूआरएल में नामांकन (आमतौर पर मानव पठनीय) भाग के लिए तकनीकी शब्द है। ज्यादातर एसईओ के लिए इस्तेमाल किया जाता है या यूआरएल बेहतर दिखता है। – Alex

+0

ठीक है .... उस मामले में अच्छी तरह से 'Utility.ToSlug()' 'ISluggable' जैसी चीज़ पर काम नहीं करना चाहिए? –

उत्तर

13

आपका Utility परियोजना को संदर्भित अपने MyCompany.MyProject.Domain एक कोड गंध का एक सा की तरह लगता है के लिए प्रतिनिधि उपयोगिता के ToSlug कॉल। मैं यहां मान रहा हूं कि ये ऐसी सुविधाएं हैं जो विशेष रूप से डोमेन ऑब्जेक्ट्स पर काम करती हैं - यदि ऐसा है, तो आप MyCompany.MyProject.Utilities को अपने Domain प्रोजेक्ट (स्वाभाविक रूप से, नामस्थान को संशोधित करके) क्यों नहीं शामिल करते हैं?

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

अपने विशेष स्थिति में हालांकि, एक अंतरफलक शुरू करने, अर्थात पर विचार करें, INameHolder:।

public interface INameHolder 
{ 
    string FirstName { get; set; } 
    string LastName { get; set; } 
} 

फिर Contact लागू करता INameHolderINameHolder किसी अन्य असेंबली में मौजूद है, चलो इसे MyCompany.MyProject.Domain.Interfaces पर कॉल करें।

फिर अपने Utilities परियोजना का संदर्भ Interfaces (नहींDomain) और Domain ऐसा नहीं करता है, लेकिन कुछ भी Interfaces को संदर्भित नहीं करती - वृत्तीय संदर्भ टूटी हुई है।

+0

मैं शायद इसके साथ जाऊंगा .... अभी प्रयोग कर रहा हूं। – Alex

2

प्रतिलिपि ToSlug विधि और इस नई विधि

+0

'इस नई विधि के लिए प्रतिनिधि उपयोगिता की ToSlug कॉल करें' - कृपया स्पष्ट करें? कैसे? – Alex

+0

यह मेरा प्रारंभिक विचार भी था - लेकिन मुझे लगता है कि डोमेन साझा नहीं किया गया था इस प्रकार विस्तार की लाइब्रेरी को लोड करने की इजाजत नहीं दी गई थी। मैं गलत हो सकता था। –

2

यदि आप डोमेन (शायद सही) साझा नहीं कर सकते हैं और इसे साझा लाइब्रेरी से तर्क का उपभोग करना चाहिए तो आपको वास्तव में एक और असेंबली पेश करनी होगी।

या आप निर्भर पुस्तकालय तक पहुंचने के लिए डोमेन में प्रतिबिंब द्वारा डोमेन में रनटाइम पर तर्क लोड कर सकते हैं। यह मुश्किल नहीं है बस समय जांच संकलन तोड़ता है।

2

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

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