2016-03-30 15 views
9

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

एक एक्सटेंशन उसी वास्तुकला पर बनाया गया है जो एमवीसी ऐप है, जिसका मतलब नियंत्रक फ़ोल्डर है, जो नियंत्रक, संबंधित दृश्य और दृश्यकंपेंट्स के साथ समाप्त होता है जो/व्यू/कंट्रोलरनाम में स्थित हैं और संबंधित मॉडल हैं।

यह परियोजना के लिए संदर्भ के रूप में इस परियोजना को जोड़ना संभव नहीं है, इसलिए मैं एक मिडलवेयर है कि उन्हें रनटाइम पर लोड बनाया:

foreach (var item in extensions) 
{ 
    Assembly.LoadFrom([email protected]"extensions\{item.Name}.dll"); 
} 

अब तक तो अच्छा है, वे क्रम पर लोड कर रहे हैं। लेकिन, जब मैं विस्तार के नियंत्रक में से एक में बनाए गए मार्ग तक पहुंचने का प्रयास करता हूं, तो वेबसाइट मुझे 404 प्रतिक्रिया देता है।

मैंने एक्सटेंशन को संदर्भ के रूप में जोड़ने की कोशिश की और यह अच्छी तरह से काम करता है, इसलिए यह मेरे एक्सटेंशन के अंदर कोई समस्या नहीं है।

मैं अपने डीएल के नियंत्रक को एमवीसी मुख्य साइट में पंजीकृत करने का प्रबंधन कैसे कर सकता हूं?

यह एएसपी MVC 4 नहीं है, यह एएसपी कोर है, इसलिए ऐसा लगता है कि इस उत्तर मान्य नहीं है: asp.net mvc put controllers into a separate project

हालांकि निर्भरता इंजेक्शन एक समाधान हो सकता है, मैं अपने एक्सटेंशन बनाने के लिए किसी भी समाधान नहीं मिला है अपने लिए सेवाएं पंजीकृत करें (और यह एक्सटेंशन निर्माता के लिए जटिल है)।

एक्सटेंशन के लिए मेरे मार्ग परिभाषित किया गया है नियंत्रक पक्ष:

[Route("[controller]/[action]")] 
public class LotteryController : Controller { ... } 

मेरी Startup.cs पर, मैं रखा है वास्तव में डिफ़ॉल्ट मार्ग:

app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 

तथ्य है, मैं अपने एक्सटेंशन चाहते मार्ग सक्षम करने के लिए: http://localhost/Lottery/Index

और यह मुझे एक खाली पृष्ठ देता है। मेरे वर्तमान सूचकांक कार्रवाई, परीक्षण के लिए,

// GET Index 
public IActionResult Index() 
{ 
    return Content("From extension"); 
    //return View(); 
} 

यहाँ है और मेरी विस्तार परियोजना पदानुक्रम

enter image description here

+0

क्या यह संभव है कि समस्या एक्सटेंशन लोड करने के लिए जिम्मेदार कोड के बजाय समस्या से संबंधित है? शायद आप Startup.cs में अपने कंट्रोलर कोड और/या एमवीसी कॉन्फ़िगरेशन प्रदान कर सकते हैं? – lawst

+0

उन्हें मेरे प्रश्न – cdie

+0

पर जोड़ा गया ठीक है तो ऐसा लगता है कि आप डिफ़ॉल्ट रूटिंग का उपयोग कर रहे हैं। क्या आप "इंडेक्स" के लिए नियंत्रक विधि भी प्रदान कर सकते हैं? आपने अपने प्रश्न में "व्यू/कंट्रोलरनाम" का भी उल्लेख किया है, हालांकि डिफ़ॉल्ट दृश्य निर्देशिका संरचना "व्यू/कंट्रोलरनाम" होना चाहिए, तो क्या आप यह भी पुष्टि कर सकते हैं कि दृश्य सही जगह पर स्थित है? – lawst

उत्तर

7

MVC स्वचालित रूप से नियंत्रकों, जो स्टार्टअप पर Controller से विरासत और उन्हें शामिल मिल जाएगा। यह बाहरी असेंबली के लिए काम करेगा, लेकिन संभावित रूप से उन लोगों के लिए काम करेगा जो स्थिर रूप से जुड़े हुए हैं।

यदि आप गतिशील रूप से उन्हें लोड कर रहे हैं तो आप या तो एमवीसी के स्टार्टअप को आजमा सकते हैं या देरी कर सकते हैं या असेंबली अलग से पंजीकृत कर सकते हैं।

यह कोड स्निपेट दिखाता है कि नियंत्रकों के लिए अन्य असेंबली कैसे खोजें। इसे समझाते हुए पूरा लेख here पाया जा सकता है। एक बार जब आप एमवीसी को नियंत्रकों के लिए खोजने के लिए मजबूर करने के लिए अपनी असेंबली लोड कर लेते हैं तो आप इसका उपयोग कर सकते हैं।

services.AddMvc().AddControllersAsServices(new[] 
{ 
    typeof(MyController).Assembly, 
    typeof(ExternalPocoController).Assembly 
}); 

यह उन असेंबली को नियंत्रकों के लिए खोजेगा। केवल चेतावनी यह है कि संबंधित विचारों को नहीं ढूंढ पाए।मैं ईमानदारी से इस पर यकीन नहीं कर रहा हूं क्योंकि मैंने इसे कभी भी वेबएपीआई नियंत्रकों के साथ किया है। संपादित करें:This लगता है कि यह एक तरह से

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

+0

साइड नोट का जवाब देना - कभी-कभी आप विशेषता रूटिंग का उपयोग करना चाहते हैं लेकिन कुछ अन्य मार्गों को लोड करना चाहते हैं जिन्हें आप लोड करना चाहते हैं। मेरे पास 4 रूट्स (सैकड़ों) हैं जिन्हें मैं सभी विशेषता रूटिंग के बाद लोड करता हूं, क्योंकि उन्हें एरिया पंजीकरण के माध्यम से रूटिंग करना मुझे रूटिंग रूटिंग से ज्यादा नियंत्रण देता है। Http://stackoverflow.com/questions/33155259/is-it-possible-to-change-order-of-routes-in-routing-table-when-using-attribute-r देखें –

1

जब आप असेंबली लोड करते हैं तो आपको अपने कार्यों के लिए मैन्युअल रूप से एक्शनडिस्क्रिप्टर उदाहरण जोड़ने की आवश्यकता होती है। वास्तव में 'समग्र रूट' का उपयोग करके एमवीसी 6 और अपरिवर्तनीय मार्ग तालिका बनाते हैं। आप डि में अपने कस्टम IActionDescriptorCollectionProvider डिफ़ॉल्ट लागू करने और जगह ले सकता है:

services.Replace(ServiceDescriptor.Describe(typeof(IActionDescriptorCollectionProvider), typeof(CustomActionDescriptorCollectionProvider), ServiceLifetime.Singleton)); 

और संपत्ति के गेटर में:

public ActionDescriptorCollection ActionDescriptors 

वापसी डिफ़ॉल्ट (स्टार्टअप पर निर्माण) और अपना खुद का ActionDescriptor की। मेरे समाधान में मैं इंटरमीडिएट स्टोर बनाता हूं जहां मैंने अपना स्वयं का एक्शन डिस्क्रिप्टर लगाया है जब मैं गतिशील असेंबली लोड करता हूं और IActionDescriptorCollectionProvider में मैं बस इस स्टोर को देखता हूं

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