2009-02-14 20 views
12

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

वेब साइट

यह सब सामने अंत होता है।

सी # परियोजना - MLS.Game.Data

यह मेरा सभी डेटा मैपिंग के साथ edmx फ़ाइल में शामिल है। यहां और कुछ नहीं है।

सी # परियोजना - MLS.Game.Business

यह विभिन्न वर्गों है कि मैं 'प्रबंधक' इस तरह के PlanetManager.cs के रूप में कहते हैं। ग्रह प्रबंधक के पास विभिन्न स्थैतिक विधियां हैं जिनका उपयोग ग्रह के साथ बातचीत करने के लिए किया जाता है, जैसे कि getPlanet (int planetID) जो एमएलएस.गैम.डेटा से जेनरेट की गई कोड ऑब्जेक्ट लौटाएगा।

वेबसाइट से, मैं कुछ इस तरह करेंगे:

var planet = PlanetManager.getPlanet(1);

यह MLS.Game.Data (edmx से उत्पन्न) से से एक ग्रह वस्तु देता है। यह काम करता है, लेकिन यह मुझे डिग्री के लिए परेशान करता है क्योंकि इसका मतलब है कि मेरे सामने वाले अंत को एमएलएस.गैम.डाटा का संदर्भ देना है। मैंने हमेशा महसूस किया है कि जीयूआई को केवल बिजनेस प्रोजेक्ट को संदर्भित करने की आवश्यकता है।

इसके अलावा, मुझे पता चला है कि मेरे प्रबंधक वर्ग बहुत भारी हो जाते हैं। मैं उनमें दर्जनों स्थिर तरीकों के साथ खत्म हो जाऊंगा।

तो ... मेरा सवाल यह है कि - हर कोई अपनी एएसपी ईएफ परियोजनाओं को कैसे रखता है?

संपादित

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

धन्यवाद

+0

- कि जहां डाटा और अमीर वस्तुओं की जुदाई का अपना में आता है। समृद्ध वस्तुएं समझती हैं कि उन्हें संशोधित करने वाले संचालन को समाहित करते समय उनके गुणों का खुलासा कैसे किया जाए। डीटीओ केवल दृढ़ता परत में डेटा हस्तांतरण के लिए हैं और कोई तर्क की आवश्यकता नहीं है। – flesh

उत्तर

3

आप चीजों को बेहतर बनाने के लिए निम्न को आज़मा सकते:

  • उपयोग एफई अपने डेटा परत में DTOs लाने के लिए है, तो इन DTOs का उपयोग अपने व्यापार परत में अमीर व्यापार वस्तुओं को भरने के लिए। आपके यूआई को केवल व्यापार परत को संदर्भित करने की आवश्यकता होगी।
  • एक बार जब आप समृद्ध व्यावसायिक वस्तुएं बना लेते हैं, तो आप प्रबंधक वर्ग से कुछ तर्क को आंतरिक रूप से शुरू कर सकते हैं, प्रभावी रूप से व्यावसायिक परत को साफ कर सकते हैं।

मैं व्यक्तिगत रूप से प्रबंधक मॉडल पर अमीर मॉडल पसंद करता हूं क्योंकि, जैसा कि आप कहते हैं, आप स्थिर विधियों के भार के साथ समाप्त होते हैं, जो आप अनिवार्य रूप से अन्य स्थैतिक तरीकों के साथ एक साथ चेनिंग समाप्त करते हैं। मुझे यह भी बहुत गन्दा लगता है, और अधिक महत्वपूर्ण बात यह है कि किसी भी समय दिए गए बिंदुओं पर आपकी वस्तुओं की स्थिरता को समझना और गारंटी देना मुश्किल है।

यदि आप कक्षा के भीतर तर्क को समाहित करते हैं तो आप बाह्य कॉलर की प्रकृति के बावजूद अपनी वस्तु की स्थिति के बारे में अधिक निश्चित हो सकते हैं।

रास्ते से एक अच्छा सवाल है।

+0

मुझे पसंद है कि आपका विचार कहां जा रहा है - हालांकि, क्या आप बहुत सारे काम को डुप्लिकेट नहीं करेंगे? उदाहरण के लिए, यदि एक डीटीओ के पास विभिन्न गुण हैं, तो संभवतः आप कक्षा के अपने 'अमीर' संस्करण में उन सभी गुणों को फिर से बनायेंगे। सही? – bugfixr

+0

हालांकि अतिरिक्त के बाद - क्या आपने कभी अपनी बीएलएल परत में कक्षाएं बनाई हैं जो डाटा लेयर में डीटीओ से प्राप्त होती हैं? यह कुछ अनुकूलन सक्षम करेगा। विचार? बुरा विचार? – bugfixr

+1

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

0

मैं कोई विशेषज्ञ हूँ, लेकिन है कि मेरे पास बहुत अच्छा लगता है। मेरे समाधान में जो कुछ है, वही है, सिवाय इसके कि मैं सिर्फ बिजनेस प्रोजेक्ट के साथ ईएफ प्रोजेक्ट को विलय करता हूं। मेरे समाधान इतने बड़े नहीं हैं, और मेरी वस्तुओं को बहुत सारी बुद्धि की आवश्यकता नहीं है, इसलिए यह मेरे लिए ठीक है। मेरे पास भी मेरे प्रत्येक स्थिर सहायक कक्षाओं के लिए अलग-अलग तरीकों का एक टन है।

यदि आप प्रस्तुति परत डेटा एक्सेस परत के बारे में नहीं जानना चाहते हैं, तो आपको कुछ मध्यस्थ कक्षाएं बनाना होगा, जो शायद बहुत अधिक काम करेंगे। तो आपके वर्तमान सेटअप में समस्या क्या है?

+1

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

2

आईएमएचओ, आपका वर्तमान लेआउट ठीक है। आपके यूआई के लिए 'डेटा' परत को संदर्भित करने के लिए यह बिल्कुल सामान्य है क्योंकि आप इसे कॉल कर रहे हैं। मुझे लगता है कि शायद आपकी चिंता शब्दावली के कारण उत्पन्न हो रही है। आपके द्वारा वर्णित 'डेटा' को अक्सर 'व्यावसायिक ऑब्जेक्ट्स' (बीओएल) परत के रूप में जाना जाता है। एक सामान्य लेआउट तब एक व्यापार तर्क परत (बीएलएल) होना चाहिए जो आपकी 'प्रबंधक' परत और डेटा एक्सेस लेयर (डीएएल) है। आपके परिदृश्य में, LINQ से Entites (मान लें कि आप इसका उपयोग करेंगे) आपका डीएएल है। एक सामान्य संदर्भ पैटर्न तब होगा: -

यूआई संदर्भ बीएलएल और बीओएल। बीएलएल बीओएल और डीएएल (LINQ से Entites) को वापस लाता है।

अधिक जानकारी के लिए this series of articles पर एक नज़र डालें।

+0

मैं तुम्हारा बिंदु देखता हूं। हालांकि ईएफ के मामले में, मेरे पास बीओएल को डीएएल के साथ संयोजित करने के अलावा कोई विकल्प नहीं है क्योंकि बीओएल विज़ार्ड द्वारा उत्पन्न होता है जो ईएफ बनाता है। क्या मुझे कुछ याद आ रही है? – bugfixr

+0

क्षमा करें, मेरे हिस्से पर गलत विवरण। ईएफ आपका डीएएल नहीं है। डेटाबेस से आइटम प्राप्त करने के लिए आप जो भी परत उपयोग करते हैं, वह आपके डीएएल होगा, संभवतः LINQ से Entitites। उस मामले में मैं जिस मॉडल का वर्णन करता हूं वह अभी भी रखता है। आपका जेनरेट किया गया बीओएल अभी भी ईएफ का उपयोग कर बस एक बीओएल है। मैं पोस्ट संपादित करूंगा। –

0

आपका लेआउट ठीक दिखता है। मैं एक उपयोगिता/आम स्तर जोड़ा है |

वेब UI
व्यापार लेयर
Dataobjects
उपयोगिताएँ परत

2

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

या यदि यह पर्याप्त नहीं है तो आप डिज़ाइनर को खा सकते हैं और अपना स्वयं का ईएफ सक्षम कक्षाएं लिख सकते हैं।

वहाँ एक (संक्षिप्त) दोनों विकल्प यहाँ की चर्चा है - http://msdn.microsoft.com/en-us/library/bb738612.aspx

0

मुझे लगता है कि कर रहे हैं "गूंगा वस्तु" आपका डेटा स्तर की इकाइयां का निरूपण (यानी केवल गुण) अपने व्यापार परत को DTOs जोड़ना होगा। फिर अपने "प्रबंधक" वर्गों जैसे, उन्हें वापस कर सकते हैं:

class PlanetManager 
{ 
    public static PlanetDTO GetPlanet(int id) { // ... } 
} 

और अपने यूआई केवल Pocos के माध्यम से BLL परत के साथ सौदा कर सकते हैं; प्रबंधक (जिसे मैं "मैपर" वर्ग कहूंगा) ऑब्जेक्ट्स और डेटा लेयर के बीच सभी अनुवादों को संभालता है। इसके अलावा यदि आपको कक्षा का विस्तार करने की आवश्यकता है, तो आपके पास डीटीओ ऑब्जेक्ट पर "आभासी" संपत्ति हो सकती है और प्रबंधक ने इसे अपने घटकों में वापस अनुवादित किया है।

1

"संपादित करें" अनुभाग में अपने दूसरे प्रश्न का सवाल है:

अगर मैं गलत नहीं हूँ, एफई द्वारा उत्पन्न वर्गों सील नहीं कर रहे हैं, और वे आंशिक वर्ग हैं, ताकि आप आसानी से उन का विस्तार कर सकता है जेनरेट की गई फाइलों को स्वयं छूए बिना।

उत्पन्न वर्ग होगा:

public partial class Planet : global::System.Data.Objects.DataClasses.EntityObject 
{ 
... 
} 

ताकि आप आसानी से अपने खुद के "PlanetAddons.cs" बना सकते हैं (या जो भी आप इसे कॉल करना चाहते हैं) इस वर्ग का विस्तार करने के:

public partial class Planet 
{ 
property int Population {get; set;} 
... 
} 

बहुत साफ, आह? .... निकाले जाते हैं और कृत्रिम वस्तु पदानुक्रम बनाने की आवश्यकता

मार्क

अपने संपादित के जवाब में