2012-06-18 19 views
36

में नियंत्रक उसी समाधान में, एक एएसपी.नेट एमवीसी 4 एप्लीकेशन Slick.App और कक्षा पुस्तकालय Awesome.Mvc.Lib है। Awesome.Mvc.Lib में एक नियंत्रक वर्ग शामिल है।अलग असेंबली और रूटिंग

public class ShinnyController : Controller 
{ 
    [HttpGet] 
    public string Index() 
    { 
     return "Hello, from Awesome.Mvc.Lib"; 
    } 
} 

मैं बस, Awesome.Mvc.Lib को Slick.App से संदर्भ जोड़ने /shinny के लिए आवेदन और बिंदु ब्राउज़र से चलाते हैं, मैं वास्तव में प्रतिक्रिया देखेंगे "हैलो, Awesome.Mvc.Lib से"।

यह ऐसा कुछ है जिसकी मुझे उम्मीद नहीं है। हर बार मैंने सोचा कि एएसपी.नेट एमवीसी वहां रखरखाव वाले नामस्थानों का सम्मान करता है। इसलिए, किसी अन्य नेमस्पेस के नियंत्रकों का खुलासा नहीं किया जाता है, कम से कम इससे पहले कि मैंने नहीं पूछा था।

मैंने नामस्थान पैरामीटर का उपयोग करने के लिए डिफ़ॉल्ट मार्ग पंजीकरण बदलने की कोशिश की।

routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
     namespaces: new [] { "Slick.App.Controllers" } 
    ); 

फिर भी, ShinnyController मार्ग अभी भी '/ shinny' के लिए मेल खाता है।

मुझे कोई चिंता है कि यह सही डिफ़ॉल्ट व्यवहार है। मेरा सवाल यह है कि, स्पष्ट रूप से कहने के लिए कि कौन से नियंत्रकों का खुलासा किया गया है और अलग-अलग वर्ग पुस्तकालय में नियंत्रकों से मिलान करने के लिए डिफ़ॉल्ट मार्ग को रोकें?

उत्तर

30

मार्ग पर नामस्थान सूची ही देता है प्राथमिकता दूसरों पर कुछ नामस्थान, जो सूचीबद्ध नहीं हैं करने के लिए: के रूप में एक उम्मीद होती है

new [] {"Namespace1", "Namespace2"} 

Namespace1 को उच्च प्राथमिकता नहीं देता है लेकिन सिर्फ दूसरों के नाम पर दोनों नामों को प्राथमिकता देता है।

इसका मतलब है कि सूची में नामस्थान पहली बार नियंत्रकों के लिए खोजे जाते हैं और फिर, यदि कोई मिलान नहीं मिलता है तो उस नाम के साथ शेष उपलब्ध नियंत्रकों का उपयोग किया जाता है।

आप ऐसा करके गैर प्राथमिकता के आधार पर नियंत्रक के उपयोग को दबाने कर सकते हैं:

var myRoute = routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
     namespaces: new [] { "Slick.App.Controllers" } 
    ); 

myRoute.DataTokens["UseNamespaceFallback"] = false; 
3

आप इस तरह DefaultControllerFactory से विरासत कर सकते हैं:

public class CustomControllerFactory : DefaultControllerFactory 
{ 
    protected override Type GetControllerType(System.Web.Routing.RequestContext requestContext, string controllerName) 
    { 
     var type = base.GetControllerType(requestContext, controllerName); 

     if (type != null && IsIngored(type)) 
     { 
      return null; 
     } 

     return type; 
    } 

    public static bool IsIngored(Type type) 
    { 
     return type.Assembly.GetCustomAttributes(typeof(IgnoreAssemblyAttribute), false).Any() 
      || type.GetCustomAttributes(typeof(IgnoreControllerAttribute), false).Any(); 
    } 
} 

फिर Global.asax के लिए कुछ परिवर्तन

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

     ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory()); 
    } 

और यहां आप हैं! IgnoreControllerAttribute के साथ चिह्नित कोई भी प्रकार दिखाई नहीं देगा। आप पूरी असेंबली को भी छुपा सकते हैं।

आप कुछ विन्यास आधारित व्यवहार की जरूरत है, यह सभी आवश्यक परिवर्तन करने के लिए एक महान बात नहीं है;)

+1

Unfortunatelly, इस वास्तव में क्या है मेरी समस्या नहीं है। मेरी समस्या यह है कि मेरे पास होस्ट एप्लिकेशन तक कोई पहुंच नहीं है, इसलिए कस्टम कंट्रोलर फैक्ट्री का निर्माण मेरे लिए काम नहीं करेगा। –

+0

@alexanderb: नहीं, आप इसका उपयोग करके ऐसा कर सकते हैं: [असेंबली: System.Web.PreAplicationStartMethod (टाइपोफ (MvcTools.Hooks.PreAplicationStartCode), "प्रारंभ करें")], यह लिंक देखें: http: //blog.davidebbo। com/2011/02/register-your-http-modules-at-runtime.html शुरुआत में, आप यह करते हैं: System.Web.Mvc.ControllerBuilder.Current.SetControllerFactory (YOUR_ControllerFactory)); आपको बस इतना करना है कि होस्ट एप्लिकेशन को अपना डीएल लोड करने के लिए, जिसे आप web.config एंट्री द्वारा प्राप्त कर सकते हैं;) –

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