14

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

इसके अलावा, क्या इससे पहले कि मैं इसमें बहुत दूर हो जाऊं, इससे बचने के लिए कोई नौसिखिया जाल है?

कई धन्यवाद, सभी .....

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

+1

स्ट्रक्चर मैप के साथ मेरा नौसिखिया जाल मध्यम ट्रस्ट के तहत सुरक्षा अनुमति अपवाद था। यदि आपका ऐप मध्यम ट्रस्ट वातावरण में चलाएगा तो आप वैकल्पिक डी कंटेनर को देखना चाहेंगे। –

उत्तर

2

बेहतर टीडीडी को प्रोत्साहित करने के लिए। दो परीक्षण परियोजनाएं और नामस्थान X.Unit.Tests & X.Integrations.Tests है।

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

उदा।

/Config/ServiceRegistry.cs /Config/RepositoryRegistry.cs /Config/Bootstrapper.cs

Global.asax में मैं Bootstrapper.Init (कहते हैं) और इस x.AddRegistry फोन करेगा (नए ServiceRegistry ()) और इसी तरह।

मेरे यूनिट परीक्षणों में आपको केवल अपने एकीकरण परीक्षणों में DI का उपयोग करने की आवश्यकता नहीं है। मेरे एकीकरण में उदाहरण उदा। यदि मैं डेटाबेस के माध्यम से NHibernate का परीक्षण कर रहा हूं तो मैं टेस्टसेटअप में रेस्पोजिटरी रजिस्ट्री के साथ एसएम शुरू कर सकता हूं, एक सहायक विधि के साथ बस GetInstance() को लपेटें।

मैं प्रोजेक्ट्स में विभाजित नहीं हूं। बूटस्ट्रैपर और डोमेन जब तक मुझे पूरी तरह से नहीं है ... तीन परियोजनाएं, एक्स, एक्स। यूनिटटेस्ट, एक्स। इंटीग्रेशन यदि आपको बाद में और अधिक कदम की आवश्यकता होती है। मैं एक पृष्ठभूमि/कंपनी से आया था जिसमें दर्जनों परियोजनाएं थीं, जिन्हें पहली बार गंदे लगते थे, लेकिन अब नहीं, मैं तेजी से दौड़ने के लिए आगे बढ़ता हूं और आवश्यकता होने पर बाद में समाधान संरचना को पुनर्गठित करता हूं।

10

यदि आप प्रोजेक्ट पर काम करने वाले अकेले हैं तो मैं करता हूं जो आपको पहले पर समझ में आता है। आप पर एक निर्देशिका या परियोजना संरचना लगाए जाने से कुछ भी बुरा नहीं है जो आपको अनजान लगता है। \ Core \ फ़ोल्डर या \ नियंत्रक \ फ़ोल्डर में बेसकंट्रोलर क्लास है? व्यक्तिगत रूप से मैं नियंत्रक में देखता हूं लेकिन कुछ लोग कसम खाता है कि यह \ Core \ या \ Bases में होना चाहिए।

पहले नौसिखिया जाल सोच रही है कि आप गलत तरीके से अपने कोड को व्यवस्थित कर सकते हैं और किसी भी तरह से इस परियोजना की सफलता पर दर्शाता है। मैंने परियोजनाएं देखी हैं जहां 30 फाइलें एक फ़ोल्डर और अन्य परियोजनाओं में थीं जहां 30 फाइलों के लिए 20 फ़ोल्डर्स थे।

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

मैं ईमानदार रहूंगा कि मैं अभी एक परियोजना पर काम कर रहा हूं और मुझे यह भी यकीन नहीं है कि कुछ कक्षाएं मेरी फ़ाइल संरचना में कहां रहती हैं। परिभाषा/घोषणा पर जाएं कीबोर्ड शॉर्टकट्स मैं बहुत उपयोग करता हूं। क्योंकि यह केवल कोड के साथ काम कर रहा है यह ठीक है। अगर मुझे परियोजना पर एक और डेवलपर जोड़ना पड़ा तो मैं शायद चीजों को साफ कर दूंगा।

व्यक्तिगत रूप से मैं एक ही फ़ोल्डर के अंदर अपने कार्यान्वयन प्रकारों के साथ इंटरफेस डालता हूं। IPaymentGateway AuthorizeNetGateway और PaypalGateway के समान फ़ोल्डर में है। अगर मैं अपने समाधान एक्सप्लोरर साइडबार में एक ही समय में उस फ़ोल्डर में सभी फ़ाइलों को नहीं देख पा रहा हूं तो मैं सभी गेटवे फ़ाइलों को \ Gateway \ फ़ोल्डर में ले जाता हूं।

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

ForRequestedType<Customer> 

क्लीनर की तुलना में

using KevDog.Models 
using Customer=KevDog.Models.Customer 

या

ForRequestedType<KevDog.Models.Customer> 

एक और तरीका है इस समस्या से बचने के लिए स्पष्ट हो रहा है जब आपके नामकरण बातें: ग्राहक, CustomerViewModel, CustomerController, CustomerDataRow, CustomerView

टीडीडी के लिए आपको प्रबंधन के लिए लगभग दो बूटस्ट्रैपर्स रखना होगा आपके ठोस प्रकार। आप वास्तव में नहीं चाहते हैं कि आपके यूनिट परीक्षण AuthorizeNetGateway का उपयोग करें: IPaymentGateway, बल्कि StubGateway: IPaymentGateway।

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

मैं आमतौर पर एमवीसी ऐप्स के लिए डिफ़ॉल्ट संरचना भी रखता हूं। 99% सभी ट्यूटोरियल और वीडियो के समान संरचना में अपना कोड रखना आसान है।

उम्मीद है कि इससे मदद मिलती है।

+0

धन्यवाद jfar! टीडीडी पर टिप्पणी वास्तव में ऐसी चीजें हैं जिनके बारे में पूछना है। मुझे लगता है कि प्रत्येक परियोजना के लिए बूटस्ट्रैपर का विचार जाने का तरीका है। यूनिट टेस्ट प्रोजेक्ट में से एक और एमवीसी प्रोजेक्ट में से एक – KevDog

0

मेरे लिए एक ही समस्या को हल करने का मेरा पहला प्रयास है, लेकिन चूंकि यह मेरा पहला प्रयास है, इसलिए मुझे उम्मीद है कि लोग इस पर टिप्पणी कर सकते हैं या आलोचना कर सकते हैं जितना मैं उम्मीद करता हूं कि यह एक संभावित समाधान के रूप में कार्य कर सकता है आप:

public VatManager() 
: this(new VatManagerRegistry()) { } 

public VatManager(Registry registry) 
: this(new Action<IInitializationExpression>(x => { x.AddRegistry(registry); })) 
    { 
    } 

public VatManager(Action<IInitializationExpression> action) 
    { 
    ObjectFactory.Initialize(action); 
    data = ObjectFactory.GetInstance<IVatManagerData>(); 
    } 

मैं तीन निर्माता भार के है - parameterless डिफ़ॉल्ट निर्माता ठोस StructureMap रजिस्ट्री कि एक उत्पादन के संदर्भ में उपयोग के लिए बनाया जाना चाहिए की ज्ञान है।अन्य दो अन्य कोड को अनुमति देते हैं जो इस प्रबंधक वर्ग को अपनी खुद की संरचना मैप रजिस्ट्री (ओं) या क्रियाएं प्रदान करने के लिए तत्काल करता है ताकि वे निर्भरता इंजेक्शन को स्वयं नियंत्रित कर सकें, जैसे स्वचालित परीक्षण के मामले में उन लोगों के ठोस उदाहरणों के बजाय मैक्स प्रदान करना निर्भरता। मुझे यह जोड़ना चाहिए कि यह समाधान एएसपी.नेट एमवीसी संदर्भ के लिए विशेष नहीं है और * .config फ़ाइलों से किसी भी कॉन्फ़िगरेशन जानकारी को खींचता नहीं है।

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

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