2010-07-16 20 views
9

मैं यहाँ सोच रहा था, कैसे तुम लोग, कार्यक्षमता, गुंजाइश के संदर्भ में अपनी परियोजनाओं, व्यवस्थित करूँ आदिसी # परियोजना आयोजित करने का सबसे अच्छा तरीका क्या है?

आप इकाई परीक्षण के लिए एक परियोजना, वर्ग पुस्तकालय कोड के लिए एक परियोजना, उपयोगकर्ता इंटरफ़ेस के लिए एक परियोजना है?

या क्या आप इन सभी को अलग फ़ोल्डर में विभाजित करते हैं?

मैं सोच रहा था कि परियोजनाओं से इन्हें अलग करना आसान है, क्योंकि आपकी केंद्रीय कोड लाइब्रेरी एक ही स्थान पर है, बिना उपयोगकर्ता इंटरफेस (कोई WinForms निर्भरता) या यूनिटटेस्ट के प्रत्यक्ष संदर्भ के बिना।

कोई राय?

उत्तर

13

मैं परियोजनाओं को विभाजित करने की कोशिश करता हूं जिसे आप "तैनाती इकाइयों" कह सकते हैं। दूसरे शब्दों में, "मैं इन असेंबली को कैसे तैनात कर सकता हूं?"

क्योंकि मैं स्पष्ट रूप से यूनिट परीक्षणों को तैनात नहीं कर रहा हूं, वे अपने स्वयं के प्रोजेक्ट में हैं।

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

मैं कोड के लिए एक अलग लाइब्रेरी रखने की भी कोशिश करता हूं जिसे मैं समाधान के बीच साझा कर सकता हूं। यह मेरी डेटा एक्सेस यूटिलिटीज, फाइल पार्सिंग यूटिलिटीज, और अन्य जो मैं प्रोजेक्ट्स बनाते समय उपयोग करता हूं। मैं केवल उन नए असेंबली को अपने नए समाधानों में शामिल कर सकता हूं और मुझे वह सारी कार्यक्षमता मिलती है जिसे मैंने पहले ही अपना समय निवेश किया है।

आशा है कि मदद करता है। (

xxx.Shell.Exe

xxx.yyyModule.dll 4- एक्स: -

2

स्टैक ओवरफ़्लो और Google पर कुछ खोजें - ऐसे लोग हैं जिन्होंने एक ही प्रश्न पूछा है।

कुछ विचार:

दृश्य स्टूडियो समय लेता है कई परियोजनाओं, एकल बड़ी परियोजनाओं से साथ समाधान संकलित करने के लिए। अपने समाधान को बहुत बारीक से विभाजित न करें।

माइक्रोसॉफ्ट के Composite Application Guidance परियोजनाओं को विभाजित करने का एक दिलचस्प तरीका है। एक इंफ्रास्ट्रक्चर प्रोजेक्ट, एक बूटस्ट्रैपर प्रोजेक्ट है, और फिर कोड के प्रत्येक "मॉड्यूल" के लिए परियोजनाएं हैं।

वर्तमान में मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जो परियोजनाओं को आपके उदाहरण की तरह ही विभाजित करता है: बुनियादी ढांचा, व्यापार तर्क, जीयूआई, और यूनिट परीक्षण।

मैं उद्देश्य से फ़ाइलों को व्यवस्थित करना पसंद करता हूं, प्रकार नहीं। उदाहरण के लिए, मैं "घटनाक्रम" और "इंटरफेस" की बजाय "संचार" और "इंटरऑप" नामक फ़ोल्डर बनाते हैं।

1

आप इकाई परीक्षण के लिए एक परियोजना, वर्ग पुस्तकालय कोड के लिए एक परियोजना, उपयोगकर्ता इंटरफ़ेस के लिए एक परियोजना है?

बहुत कुछ। आम तौर पर यूआई दुबला रखें और किसी भी व्यावसायिक तर्क को अपने स्वयं के प्रोजेक्ट में ले जाएं, प्रति व्यवसाय तर्क परियोजना के एक परीक्षण परियोजना के साथ।

0

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

इसके अलावा, कुछ अन्य सलाह जो मैं उधार दे सकता हूं निश्चित रूप से कुछ तृतीय पक्ष वर्ग पुस्तकालयों को एकत्रित करता है और कोड पुन: उपयोग स्पष्ट या स्पष्ट होने पर स्वयं को लिखता है।

3

अंतिम कुछ परियोजनाओं मैं में शामिल किया गया है हम निम्नलिखित संरचना (सभी WPF प्रिज्म परियोजनाओं) के साथ समाप्त हो गया 7)

xxx.Tests

xxx.Model

xxx.Common

और उन है कि WCF का उपयोग के लिए - जोड़ें:

xxx.Backend

xxx.DataContracts

सभी एक ही समाधान (हम लंबे निर्माण समय के साथ रहते हैं ...) इसे डिवाइडिंग में में अलग-अलग समाधानों ने रिफैक्टरिंग के दौरान बहुत सी समस्याएं पेश कीं। अब तक - यह हमारे लिए बहुत अच्छा काम किया है।

4

कुछ पैटर्न मैं एक समाधान के भीतर परियोजनाओं के आयोजन में उपयोगी पाया गया है:

मैं लगभग हमेशा एक "आम" या "utils" परियोजना है। इस परियोजना में बहुत कम निर्भरता होनी चाहिए, इसलिए इसे आसानी से मेरे समाधान (या संभवतः अन्य समाधानों में) कहीं भी और हर जगह फिर से उपयोग किया जा सकता है। आप आश्चर्यचकित होंगे कि इस परियोजना में कितने छोटे सहायक वर्ग आएंगे।

मैं हमेशा अपने व्यवसाय तर्क को एक परियोजना (या परियोजनाओं के एक सेट की संभावना) में अलग करने की कोशिश करता हूं, और मेरे बूटस्ट्रैप/प्रदाता कोड को एक अलग परियोजना (या परियोजनाओं के सेट) में अलग करने का प्रयास करता हूं। मेरा बूटस्ट्रैप/प्रदाता वर्ग संदर्भ-विशिष्ट हैं (वे एक HttpContext या कमांड लाइन तर्क, आदि की उपस्थिति मान सकते हैं), लेकिन उनमें कोई व्यावसायिक तर्क नहीं है। मेरे व्यवसाय वर्ग व्यवसाय तर्क को लागू करते हैं, लेकिन किसी संदर्भ-विशिष्ट तत्वों की उपस्थिति या अनुपस्थिति को न मानें। इस तरह, अगर मैं शुरुआत में सिस्टम को कंसोल ऐप के रूप में बना देता हूं, तो मैं बाद में विंडोज़-सर्विस बूटस्ट्रैप/प्रदाताओं का एक सेट लिख सकता हूं, और इसे जल्दी से विंडोज़ सेवा में बदल सकता हूं, जिसमें बिजनेस क्लासेस पर कम-से-कम प्रभाव पड़ता है।

बूटस्ट्रैप/प्रदाता कक्षाओं के समान, मैं अपने व्यवसाय वर्ग से अपनी डेटा परत को अलग करने का भी प्रयास करता हूं। लेकिन यह एक आम, बुनियादी अलगाव है कि हर किसी ने 1000 बार सुना है, इसलिए यह उल्लेखनीय रूप से उल्लेखनीय है।

कई प्रणालियों का व्यवसाय तर्क एक ही परियोजना में फिट होने के लिए बहुत जटिल है और कोड की रखरखाव की डिग्री रखता है। इस प्रकार, मैं आमतौर पर कई व्यावसायिक तर्क परियोजनाओं के साथ मिल जाता हूं, जो कार्यात्मक क्षेत्र ("ग्राहक मैंगमेंट", "उत्पाद सूची" आदि) द्वारा समूहीकृत होते हैं।

+0

मेरे पास एक प्रोजेक्ट नहीं है, न कि एक प्रोजेक्ट। मेरे पास कक्षा आरेख, कक्षाओं का पुनर्मूल्यांकन, आदि में अच्छी सलाह है! –

3

मैं एक समाधान के भीतर परियोजनाओं के संदर्भ में कुछ इस तरह जाना:

प्रशासन - मैं आमतौर पर भी इस एक छोटे से कमांड लाइन करने के लिए संकलन कर देंगे जनरल प्रलेखन, लाइसेंस की मास्टर कॉपी, आदि "रीडमी "आवेदन जो लाइसेंस, संशोधन नोट्स इत्यादि प्रदर्शित करता है।

डेटा - सामान्य डेटा, जैसे कि XML आदि। कोई संकलित कोड नहीं।

लाइब्रेरी 1 ... लाइब्रेरीएन - एक या अधिक पुस्तकालय (आमतौर पर 1-3: यूटिल, कोर, विस्तारित कोड)।

आवेदन 1 ... आवेदन एन - आवेदन (आमतौर पर एक)।

टेस्ट 1 ... टेस्टएन - टेस्ट।

प्रत्येक प्रोजेक्ट के भीतर, मैं अलग-अलग फ़ोल्डर्स, उप-फ़ोल्डरों में उप-नामस्थानों में प्रत्येक नेमस्पेस के लिए फ़ाइलें रखता हूं। मैं सामान्य प्रकार की सामग्री रखता हूं, जैसे प्रलेखन, लाइब्रेरी या ऐप-विशिष्ट डेटा, एम्बेडेड लाइसेंस टेक्स्ट, आदि, परियोजना के बावजूद एक ही नाम के साथ subfolders में।

-Neil

1

आप एक यूआई के साथ एक व्यापार-ish आवेदन कर रहे हैं, तो आप MVC ध्यान देना चाहिए।

बेशक, एमवीसी सिर्फ एक सामान्य अवधारणा है, लेकिन यह वह है जो आपको इस तरह के निर्णय लेने में मदद करता है कि आप अभी सामना कर रहे हैं।

WPF में एमवीसी पर बहुत से संसाधन हैं, जो आप शायद WinForms पर भी सीधे आवेदन कर सकते हैं।

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