2010-09-30 15 views
6

मैं एक कस्टम StructureMap नियंत्रक कारखाने के साथ एक ASP.NET MVC 2 आवेदन मेरी नियंत्रकों के लिए निर्भरता इंजेक्शन संभाल करने के लिए है कैसे निपटेंगे:मैं एक ASP.NET MVC नियंत्रक कारखाने में एक अपवाद

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    public override IController CreateController(RequestContext context, string controllerName) 
    { 
     Type controllerType = base.GetControllerType(context, controllerName); 
     return ObjectFactory.GetInstance(controllerType) as IController; 
    } 
} 

मैं चाहूँगा यह जानने के लिए कि मैं इस नियंत्रक फैक्ट्री में अपवादों को कैसे संभाल सकता हूं ताकि उन्हें ~/Views/Shared/error.aspx पर रीडायरेक्ट किया जा सके, जैसे वे हैंडलरर विशेषता वाले नियंत्रक में हैं। कस्टम अपरर्स विशेषता "चालू" पर सेट होने के बावजूद वर्तमान में अपवाद ऐसा नहीं करते हैं।

फिलहाल मैं "~/doesNotExist/edit/1" जैसे यूआरएल का उपयोग करके ऐसा अपवाद उत्पन्न कर सकता हूं। डिफ़ॉल्ट मार्ग के साथ:

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
); 

MVC इस मार्ग से मेल खाता है और मेरी नियंत्रक कारखाने के लिए नियंत्रक का नाम "DoesNotExist" गुजरता है। GetControllerType तब शून्य देता है और StructureMap पर कॉल में एक शून्य संदर्भ अपवाद का कारण बनता है। मैं फिर इस अपवाद को संभालने में सक्षम होना पसंद करूंगा।

ध्यान दें कि बाद में सभी मार्गों को जोड़ने से इस समस्या का समाधान नहीं होगा - एमवीसी डिफ़ॉल्ट मार्ग से मेल खाता है।

मुझे पता है कि मैं नियंत्रक के लिए डिफ़ॉल्ट मार्ग पर बाधा डालकर इस विशेष समस्या को हल कर सकता हूं लेकिन सवाल यह है कि मैं कारखाने में सामान्य एमवीसी ~/व्यू/साझा/Error.aspx का उपयोग कैसे कर सकता हूं।

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

उत्तर

2

शायद आप अपवादों को संभालने के लिए this controller factory अनुकूलित कर सकते हैं।

+0

हाँ, उस पर मुझे इंगित करने के लिए धन्यवाद - समस्या का एक बहुत अच्छा समाधान। –

0

मैं एक त्रुटि नियंत्रक बनाउंगा जो नियंत्रक फैक्ट्री द्वारा कॉल किया जाता है यदि उसे अनुरोधित नियंत्रक नहीं मिल रहा है। उसके भीतर, जो भी कार्रवाई की जा रही है उसे पकड़ने के लिए हैंडल अज्ञात एक्शन को ओवरराइड करें।

public class StructureMapControllerFactory : DefaultControllerFactory 
{ 
    public override IController CreateController(RequestContext context, string controllerName) 
    { 
     Type controllerType = base.GetControllerType(context, controllerName); 

     if (controllerType == null) 
      return ObjectFactory.GetInstance(ErrorController) as IController; 
     else 
      return ObjectFactory.GetInstance(controllerType) as IController; 
    } 
} 
+0

हाँ, यह ऐसा करेगा, हालांकि इसका मतलब यह है कि कारखाने के साथ असेंबली में त्रुटि नियंत्रक भी शामिल है। यह कोई आपदा नहीं है लेकिन अगर मैं कर सकता हूं तो मैं चिंताओं को अलग करना चाहता हूं। –

+0

अपनी खुद की परियोजनाओं में, मैं होम नियंत्रक को इंगित करता हूं और त्रुटि वाले हैंडलर को ले जाने देता हूं। पूरी तरह से अलग नहीं है, लेकिन संभावना है कि आपकी अधिकांश परियोजनाओं में होमकंट्रोलर होगा। – Clicktricity

+0

अच्छा, हाँ यह एक सुंदर सुरक्षित सम्मेलन है –

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