asp.net mvc एक अलग परियोजना में नियंत्रकों डाल दिया


107

मैं सिर्फ asp.net mvc सीख रहा हूं और मैं यह जानने की कोशिश कर रहा हूं कि अपने नियंत्रकों को एक अलग परियोजना में कैसे स्थानांतरित किया जाए। आमतौर पर जब मैंने पहले asp.net वेब ऐप डिजाइन किए होते हैं, तो मैंने अपने मॉडल के लिए एक प्रोजेक्ट बनाया, दूसरा मेरे तर्क के लिए, और फिर वेब था।

अब जब मैं asp.net mvc सीख रहा हूं तो मैं एक समान पैटर्न का पालन करने की उम्मीद कर रहा था और प्रत्येक अलग-अलग परियोजनाओं में मॉडल और नियंत्रक लगाता हूं, और बस वेब में विचार / स्क्रिप्ट / सीएसएस छोड़ देता हूं। मॉडल भाग आसान था, लेकिन जो मुझे समझ में नहीं आता है वह यह है कि एक अलग परियोजना में मेरे नियंत्रकों को "पाया" कैसे बनाया जाए। इसके अलावा, मैं यह जानना चाहूंगा कि क्या यह उचित है। धन्यवाद!

जवाबों:


92

सबसे पहले, अपने मॉडल को एक अलग प्रोजेक्ट में डालना निश्चित रूप से एक अच्छा विचार है। जैसा कि आपने खोजा है, यह तुच्छ है।

नियंत्रकों और दृश्यों के बारे में, मुझे अधिकांश बुनियादी परियोजनाओं के लिए उन्हें अलग करने का कोई स्पष्ट लाभ नहीं दिखता है, हालाँकि आपको किसी विशेष एप्लिकेशन में ऐसा करने की विशेष आवश्यकता हो सकती है।

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

एक बार जब आप अपना स्वयं का नियंत्रक नियंत्रक बना लेते हैं, तो आप निम्न लाइन को जोड़ते हैं Application_Start को Global.asax में, यह बताने के लिए कि इसे कहाँ खोजें:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

अद्यतन: इस पोस्ट और अधिक जानकारी के लिए यह लिंक लिंक पढ़ें । फिल हैक की उस पोस्ट के बारे में टिप्पणी भी देखें:

ControllerBuilder.Current.DefaultNamespaces.Add(
    "ExternalAssembly.Controllers");

... जो एक पूर्ण समाधान नहीं है, लेकिन संभवतः सरल मामलों के लिए पर्याप्त है।


2
धन्यवाद क्रेग! यह वही है जिसकी मुझे तलाश है। क्या यह जानकारी वेब पर भी मौजूद है? मैं बहुत ज्यादा नहीं भाग्य के साथ इसके लिए सब कुछ कर रहा हूँ। StackOverflow फिर से होकर आता है!
आरोन पामर

11
मैं सहमत हूं, नियंत्रक उपयोगकर्ता इनपुट संभालते हैं, मॉडल में हेरफेर करते हैं, फिर दृश्य में डेटा पास करते हैं। वे आम तौर पर एक आवेदन के लिए बहुत विशिष्ट हैं। कोई भी तर्क जो ऐप के लिए विशिष्ट नहीं है, लाइब्रेरी या मॉडल में बेहतर हो सकता है। लेकिन सामान्य रूप से नियंत्रकों को वेब प्रोजेक्ट के साथ रहना चाहिए।
३३

2
मेरे पास एक त्रुटि नियंत्रक और विचार हैं जो दो ऐप्स के बीच समान हैं। यह मेरे लिए एक ही विधानसभा में उन दोनों का उपयोग करने के लिए समझ में आता है जो दोनों ऐप का उपयोग कर सकते हैं।
सेलिंग जूडो

3
क्या नियंत्रकों का परीक्षण करना और IoC का उपयोग करना आसान नहीं है जब नियंत्रक एक अलग परियोजना में हैं - यही मुख्य कारण होगा
सैमुअल जी

1
@ शेव, मुझे नहीं लगता कि इससे कोई फर्क पड़ता है। आपके नियंत्रकों की परीक्षणशीलता के साथ अधिक है कि आप उन्हें कैसे कोडित करते हैं , न कि वे जहां रहते हैं।
क्रेग स्टंटज

19

हालाँकि, अपना स्वयं का नियंत्रक बनाना उचित है, मैंने प्रत्येक प्रोजेक्ट में अपने सभी नियंत्रकों को परिभाषित करना अधिक सुविधाजनक पाया, लेकिन उन्हें मेरे साझा प्रोजेक्ट में नियंत्रकों से प्राप्त किया है:

namespace MyProject1.Controllers
{
   public class MyController : MySharedProject.Controllers.MyController
   {
      // nothing much to do here...
   }
}

namespace MySharedProject.Controllers
{
   public abstract class MyController : System.Web.Mvc.Controller
   {
      // all (or most) of my controller logic here...
   }
}

इसका अतिरिक्त लाभ यह है कि आपके पास अपने नियंत्रक तर्क को रखने के लिए एक जगह है जो परियोजना से परियोजना में भिन्न होती है। साथ ही, अन्य डेवलपर्स के लिए अपने नियंत्रक तर्क को जल्दी से ढूंढना आसान होता है क्योंकि नियंत्रणकर्ता मानक स्थान पर मौजूद हैं।

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


1
यह बहुत अच्छी तरह से काम करता है, लेकिन मुझे रूटिंग त्रुटि को रोकने के लिए कुछ अनावश्यक कोड को खत्म करना पड़ा
केन मैक

नमस्ते, मैं इस तरह की परियोजना में मार्ग कैसे प्रबंधित कर सकता हूं? मैं विशेषता रूटिंग का उपयोग करना चाहता हूं ...
محمد

आप विशेषता रूटिंग का उपयोग वैसे ही कर सकते हैं जैसे आप सामान्य करते हैं।
ThisGuy

2
मुझे यकीन नहीं है कि यह अधिक upvotes क्यों नहीं है ... स्वीकृत उत्तर की तुलना में बहुत अधिक सुरुचिपूर्ण, मुझे लगता है। धन्यवाद!
jleach

यह मेरे लिए काम नहीं करता है। क्या आप बता सकते हैं कि यह .net Core या .Net फ्रेमवर्क है?
होमयॉउन बेहजडियन

4
  • अपने mvc प्रोजेक्ट के लिए क्लास लाइब्रेरी जोड़ें।
  • कक्षा में निम्न कोड जोड़ें (u'r नियंत्रक कोड के लिए)

    namespace ContactController
    {
    public class ContactController : Controller
    {
        public ActionResult Call()
        {
            ViewBag.Title = "Inside MyFirst Controller.";
            return View();
        }
    }

    }

  • Mvc प्रोजेक्ट व्यू फ़ोल्डर में संपर्क के लिए फ़ोल्डर जोड़ें और एक Call.cshtml फ़ाइल बनाएँ। देखें फ़ोल्डर

  • अपने मुख्य MVC प्रोजेक्ट में क्लास लाइब्रेरी प्रोजेक्ट संदर्भ जोड़ें।

संदर्भ

  • अंत में मार्ग विन्यास में संपर्क नियंत्रक नाम स्थान का संदर्भ लें।

RouteConfig


3
यह थोड़ा दुर्भाग्यपूर्ण है कि आपके पास नियंत्रक के समान नाम के साथ नाम स्थान है।
मारियस जमरो

3

मेरी समस्या System.Web.Mvcसुलझने के बाद मैंने NuGet संदर्भ को अपडेट किया ताकि MvcWebsite और Class Library समान System.Web.Mvcसंस्करण का उपयोग करें

डिफ़ॉल्ट नामस्थान जोड़ने की आवश्यकता नहीं है


समस्या यह थी कि MvcWebsite का अपवाद अपवाद नहीं था जबकि वर्तमान mvc असेंबली में क्लास लाइब्रेरी के संदर्भित mvc असेंबली की तुलना में कम संस्करण है
Homayoun Behzadian

1

जुदाई का सबसे सरल रूप मैं मूल MVC प्रोजेक्ट में "जैसा है" को बनाए रखना है, लेकिन नियंत्रणकर्ताओं को हटा दें। फिर एक नए ClassLibrary प्रोजेक्ट में कंट्रोलर क्लासेस को जोड़ें और सुनिश्चित करें कि वे कंट्रोलर से इनहेरिट करें।

MVC रूटिंग इंजन स्वचालित रूप से ClassLibrary में नियंत्रकों के लिए मार्ग देगा और नियंत्रक स्वचालित रूप से मूल MVC परियोजना से दृश्य का निर्माण करेंगे, बशर्ते आपके संदर्भ और उपयोगिता सही तरीके से हों।

मैं इस आर्किटेक्चर का उपयोग एक एचटीएमएल रिपोर्ट मॉड्यूल को लागू करने के लिए कर रहा हूं जिसे मुख्य समाधान से अलग से संकलित और तैनात किया जा सकता है। अंत में मैं SSRS से मुक्त हूँ!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.