MVVM, DDD और WPF लेयर्ड एप्लीकेशन प्रोजेक्ट स्ट्रक्चर गाइडेंस


17

मैं अपने आवेदन की संरचना को वीएस में स्थापित करने की कोशिश कर रहा हूं और मैं इसे "प्रयास" करना चाहता हूं और भविष्य में इसका प्रमाण उचित स्तर पर देना चाहता हूं। यह एप्लिकेशन एक पुराने Winform ऐप का WPF फिर से लिखना होगा, जिसके बाद कोई कन्वेंशन नहीं हुआ था। नो लेयर्स, टियर्स, परिवर्णी, आदि ...

यह काफी लार्जिश एंटरप्राइज एप्लिकेशन है। मैंने अपने DB's के रूप में Linq To SQL का उपयोग करने की योजना बनाई है और यह हमेशा MS SQL होगा। इसके अलावा, मेरे पास इसके साथ एक मौजूदा कौशल है।

मैं MVVM और DDD का सबसे अच्छा अनुसरण करना चाहता हूं, लेकिन इनको मिलाते समय मैं अपने एप्लिकेशन की संरचना पर भ्रमित हो जाता हूं। मुझे कुछ उदाहरणों के साथ समझाने और समझने की कोशिश करते हैं।

जब मैं MVVM का अनुसरण करता हूं तो मेरी फ़ोल्डर संरचना इस तरह दिख सकती है:

Views
Models
ViewModels
Helpers

लेकिन यह कैसे एक सरलीकृत DDD स्तरित दृष्टिकोण में फिट बैठता है जहाँ मेरी परियोजना संरचना इस तरह से हो सकती है:

MyApp.UI
MyApp.Domain
MyApp.Data

क्या मैं Modelsडोमेन लेयर में रखता हूं या क्या मेरे पास कहने के 3 संस्करण हैं Person? इससे एक और सवाल होता है कि मैं अपने रेपोज़िटरी और डोमेन ऑब्जेक्ट के लिए डीबी ऑब्जेक्ट के मैपिंग कहां डालूंगा? मैं डेटा मान जाएगा ...

Viewsमैं यूआई में जाना होगा, लेकिन यह ViewModelsभी होगा ?

अंत में, मैं अपने व्यावसायिक तर्क को कहां एम्बेड करूंगा?

मुझे कोडप्लेक्स, डीडीडी उदाहरण पर निम्नलिखित मिला , और यह कुछ मदद कर रहा है, लेकिन ऐसा लगता है कि यह वेब ऐप के लिए है, लेकिन इससे कोई फर्क नहीं पड़ता और मेरी अज्ञानता चमक रही है।

मुझे गलत मत समझो, मुझे पता है कि मेरे पास कई फ़ोल्डर्स हो सकते हैं और मैं जो कुछ भी चाहता हूं उन्हें कॉल कर सकता हूं। मैं यह पता लगाने की कोशिश कर रहा हूं कि चीजों को कहां रखा जाए ताकि यह पैमाने पर सक्षम हो, न कि उन स्थानों को जिन्हें जरूरी कहा जाता है।

मेरे प्रश्न का दिल इस तरह दिखाया जा सकता है।
मेरे पास इससे tblPersonउत्पन्न वस्तु है *.dbml। यह स्पष्ट है और मेरी "डेटा" परत में होगा।
अब मेरे पास मॉडल, डीटीओ, डोमेन मॉडल, या जो कुछ भी एक अलग परत (परियोजना?) कहा जाता है में होगा Person। मैं एक की आवश्यकता होगी Mapperके लिए Personकरने के लिए tblPersonकि मैं सुनिश्चित नहीं हूं जहां डाल करने के लिए।
फिर, मेरे पास एक ViewModel EditPersonहोगा , कहते हैं, कि इसका अपना गुण होगा जो इसे खींचता है, Personलेकिन संभवतः और भी।
अंत में मेरे पास एक View होगा जो उस ViewModel से जुड़ा था ...।

यह स्पष्ट करने के लिए कि पैराग्राफ मेरी मान्यताओं और अनुमानों से भरा हुआ है और मैं उम्मीद कर रहा हूं कि कोई व्यक्ति मेरे लिए हवा को साफ करने में मदद करेगा या वहां की पेशकश करेगा ताकि 6 महीने से लेकर एक साल तक मैं खुद को जरूरत से ज्यादा खुद को लात न मार पाऊं।


Linq To SQL बड़ी परियोजनाओं के लिए अनुकूल नहीं है। या तो Entity फ्रेमवर्क या nHibernate जैसे अलग ORM का उपयोग करें। इसके अलावा, क्या यह क्लाइंट-केवल एप्लिकेशन या क्लाइंट-सर्वर है?
यूफोरिक

यह एक WPF क्लाइंट-केवल एप्लिकेशन है। इसके अलावा, क्या आप बता सकते हैं कि आपको ऐसा क्यों लगता है कि L2S एक मध्यम या बड़े आकार के ऐप के लिए अनफिट है जब मेरा एकमात्र डेटा स्रोत MS SQL है?
अपवर्तित किया

जवाबों:


5

एमवीवीएम एक यूआई पैटर्न है और इसका उपयोग क्लाइंट में किया जाता है।

DDD में डोमेन के जो हिस्से क्लाइंट में उपयोग किए जाते हैं, वे शायद मॉडल का एक हिस्सा हैं

दृश्य और ViewModel केवल ग्राहक हैं।

मैंने मॉडल में (या निकट) रिपॉजिटरी डाल दी क्योंकि वे मॉडल को बैक-एंड में सिंक्रनाइज़ करते हैं।

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

संपादित करें

रिपॉजिटरी के बारे में भाग को स्पष्ट करने के लिए और बिजनेस लॉजिक की स्थिति के बारे में अधिक समझाने के लिए

यदि आप एक ऐसी प्रणाली बना रहे हैं जिसमें एक अलग क्लाइंट और सर्वर-साइड / बैक-एंड रिपॉजिटरी का उपयोग क्लाइंट और सर्वर में किया जा सकता है। क्लाइंट में सर्वर (एस) और सर्वर में एक अमूर्तता प्रदान करने के लिए अन्य सर्वर और डेटा स्रोतों का एक अमूर्त प्रदान करने के लिए। यह सिर्फ एक पैटर्न है।

व्यावसायिक नियमों के लिए: यदि आप क्लाइंट में उपयोग करते हैं, तो सुनिश्चित करें कि आप उन्हें सर्वर में भी लागू करते हैं। क्लाइंट पर कभी भरोसा न करें। क्लाइंट में व्यावसायिक नियम शीघ्र इनपुट सत्यापन के लिए अनुमति देते हैं और सर्वर के लिए दौरों को रोकते हैं।

मुझे लगता है कि डीडीडी सर्वर साइड पर है और क्लाइंट के लिए 'लीक' है।


2

WPF एप्लिकेशन के लिए MVVM डिज़ाइन पैटर्न चुनने में आपके पास सही दिशा है।

Do I put the Models in the Domain layer?

हां, आपके मॉडल डोमेन में रखे जा सकते हैं

Where would I put my Repository and mappings of DB Object to Domain Object?

आपकी रिपॉजिटरी को उस लेयर में रखा जा सकता है जहां आपका डोमेन रखा गया है। आपकी मैपिंग ऑब्जेक्ट (जिसे डीटीओ - डोमेन ट्रांसफर ऑब्जेक्ट भी कहा जाता है) को आपकी सेवा परत में रखा जाना चाहिए और आप अपने डोमेन ऑब्जेक्ट्स को आसानी से डीटीओ में मैप करने के लिए एक शक्तिशाली मैपिंग टूल ऑटोमैपर का उपयोग कर सकते हैं ।

ViewModels also?

आपके ViewModels को आपके ग्राहक पक्ष (परत) पर रखा जाना चाहिए। आप अपने विचारों के आधार पर एक या अधिक डीटीओ से अपने व्यूमोडेल का निर्माण कर सकते हैं।

डीडीडी के बारे में , मैं इस बारे में पढ़ने और आपको स्पष्ट करने की सलाह दूंगा कि आपको वास्तव में डोमेन-ड्रिवेन डिज़ाइन पैटर्न की आवश्यकता है। यहाँ एक चर्चा है कि सभी सॉफ्टवेयर अनुप्रयोगों का 95% "DDD का उपयोग करने के लिए अच्छा नहीं है" श्रेणियों में आते हैं।

संपादित करें: संदर्भ ऊपर जोड़ा गया है, और धन्यवाद @ के लिए जाओ!


कृपया, वोटिंग के समय टिप्पणी करें।
यूसुबोव

1
डीडीडी के प्रशंसक इसे हर जगह इस्तेमाल करना चाहते हैं। संबंधित लिंक: stackoverflow.com/questions/810606/is-ddd-a-waste-of-time
Den

@, लिंक के लिए धन्यवाद! मैं इसे देखने की योजना बना रहा था।
यूसुबोव

1

इससे पहले कि हम कहाँ जाते हैं, में बात करते हैं, आइए इस बारे में बात करते हैं कि प्रत्येक परत को क्या करना चाहिए।

MVVM का विक्रय बिंदु दृश्य और दृश्य-मॉडल के बीच का बंधन है। यहां लक्ष्य दृश्य के भीतर तर्क को खत्म करना है।
दृश्य की तरह, मॉडल को काफी हल्का होना चाहिए और इसका उपयोग केवल उस जानकारी (डेटा) तक पहुंचने के लिए किया जाना चाहिए जो दृश्य-मॉडल को संचालित करने के लिए आवश्यक है। मॉडल विभिन्न डेटा स्रोतों तक पहुंच को मिश्रित कर सकता है, लेकिन इसमें व्यावसायिक तर्क नहीं होना चाहिए। ज्यादातर मामलों में, आपके पास हिट करने के लिए एक एकल डेटा स्टोर है। कुछ मामलों में आप नहीं करते हैं। जब आप नहीं करते हैं, तो VM से डेटा के स्रोत को अस्पष्ट करने के लिए मॉडल का उपयोग करना उचित है।

MVVM का एक निहितार्थ यह है कि डेटा पहले से ही संग्रहीत है और आपकी परियोजना अपने संगठन को बनाए रखने के लिए ज़िम्मेदार नहीं है। कुछ परियोजनाएँ इस धारणा से दूर होने के लिए पर्याप्त भाग्यशाली हैं, मैंने जिन परियोजनाओं पर काम किया है उनमें से अधिकांश इतनी भाग्यशाली नहीं हैं। यह कहने के लिए पर्याप्त है कि डेटा एक और परत है जिसके साथ हमें संघर्ष करना होगा।

मैं अपना प्रोजेक्ट इस तरह से तैयार करूंगा:

 project.Views
 project.ViewModel
 project.Model
 project.DataStructs

और इस परत को आवश्यकतानुसार जोड़ा जा सकता है:

 project.Helpers

मैं हेल्पर्स को स्टैक के बाकी हिस्सों से अलग कर रहा हूं ताकि यह आपके एप्लिकेशन स्टैक की परत के रूप में भ्रमित न हो।

डिस्क्लेमर: मैं डीडीडी विशेषज्ञ नहीं हूं, लेकिन मैं सामान्य समझ रखता हूं और दृष्टिकोण में मूल्य देखता हूं।

आपका डोमेन वह समस्या सेट करने जा रहा है, जिस पर आप विचार कर रहे हैं। डोमेन मॉडल ViewModels है कि आप बनाने के लिए मुख्य रूप से पत्र व्यवहार करने के लिए जा रहे हैं; दृश्यों के भीतर थोड़ा; और मॉडल / DataStructs के भीतर एक छोटा हिस्सा।

तो यह कैसे काम करने जा रहा है?
यदि आपके पास मौजूदा डेटा संरचनाओं को बदलने की क्षमता है, तो आपके द्वारा बनाए गए नए लोगों को उस समस्या से संबंधित होना चाहिए जिसे आप हल करने की कोशिश कर रहे हैं। एक ग्राहक वस्तु मिल गई? फिर आपके पास ग्राहक से संबंधित / कुछ टेबल होनी चाहिए। चालान या उत्पाद मिले? एक ही कहानी - टेबल और संरचनाएं जो उन व्यावसायिक वस्तुओं के लिए नक्शा बनाती हैं, बनाई जानी चाहिए।

डोमेन आपके ViewModel ऑब्जेक्ट्स और उन ऑब्जेक्ट्स के आपके द्वारा प्रस्तुत किए गए दृश्यों के माध्यम से व्यक्त किया जाएगा। यदि आपको ग्राहक रिकॉर्ड संपादित करने की आवश्यकता है तो आपके पास उस कार्य को संभालने के लिए एक वीएम होगा।

आपके सवालों पर:

  1. MVDM पर DDD को ओवरले करने का प्रयास न करें। यह सिर्फ काम नहीं कर रहा है। DDD एक लेआउट पैटर्न नहीं है, यह आपकी समग्र समस्या को देखने का एक तरीका है।
  2. रिपोजिटरी और मैपिंग या तो प्रोजेक्ट में रहेंगे।
  3. जब तक आप प्रोजेक्ट को कॉल नहीं करना चाहते, तब तक यूआई नामक एक परत न रखें।
  4. बिजनेस लॉजिक व्यू-मॉडल में जाएगा।

1
ठीक है, कुछ, शायद अज्ञानी, सवालों का पालन करें। (1) क्या आप उनमें से प्रत्येक को अलग परियोजना या सिर्फ फ़ोल्डर्स (जैसे Project.View आदि ..) बना सकते हैं? (2) DataStructs वह जगह है जहाँ आप * .dbml या Project.Data डालेंगे। (३) तो, आपकी राय में, मैं एक Project.Domain नहीं होगा? मैंने देखा है कि कुछ बार इस्तेमाल किया है इसलिए मैं पूछ रहा हूं।
अपवर्तित किया

@RefractedPaladin - 1) परियोजना के भीतर केवल फ़ोल्डर। आप एक तर्क दे सकते हैं कि डेटा का अपना प्रोजेक्ट होना चाहिए। रखरखाव के दृष्टिकोण से, या तो रास्ता बराबर है। 2) हाँ, बिल्कुल। 3) नहीं, मेरे पास .Domain फ़ोल्डर नहीं है। IMO, हमारा काम व्यावसायिक समस्या डोमेन के लिए एप्लिकेशन को मैप करना है। इसलिए डोमेन परियोजना की सभी परतों की अनुमति देता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.