6

मेरा मुख्य एएसपी.नेट एमवीसी समग्र अनुप्रयोग पंजीकरण प्रकारों के लिए वैश्विक एकता कंटेनर का उपयोग करता है। ऐप इस वैश्विक कंटेनर का उपयोग करने के लिए नियंत्रक फैक्ट्री सेट करता है। मैं इस तरह रीफैक्टर करना चाहता हूं कि मेरे पोर्टेबल क्षेत्रों में से प्रत्येक अपने बच्चे को एकता कंटेनर लेता है, ताकि अलग-अलग क्षेत्र विभिन्न तरीकों से इंटरफेस को कार्यान्वित कर सकें। ऐसा लगता है कि मुझे प्रति क्षेत्र एक अलग नियंत्रक फैक्टरी होना चाहिए। मैं इसे कैसे पूरा करूंगा, यह देखते हुए कि निम्नलिखित कारखाने को सभी के लिए सेट करता है?विशिष्ट पोर्टेबल क्षेत्र के लिए नियंत्रक फैक्टरी

ControllerBuilder.Current 
    .SetControllerFactory(/* controller factory with global unity container */); 

उत्तर

11

आप MasterControllerFactory का उपयोग कर सकते हैं जिसमें प्रत्येक क्षेत्र के लिए सभी IControllerFactory कार्यान्वयन शामिल हैं, और यह पता है कि कौन सा कारखाना निर्माण कर सकता है RequestContext। यह वास्तव में आपको क्षेत्र द्वारा न केवल किसी भिन्नता के लिए एक अलग नियंत्रक फैक्टरी का चयन करने की अनुमति देता है। यहां बताया गया है कि यह कैसे काम करता है:

सभी क्षेत्र नियंत्रक फैक्ट्री कार्यान्वयन IControllerFactory के बजाय IFilteredControllerFactory लागू करना होगा। संदेश यह है:

public class Area51ControllerFactory:IFilteredControllerFactory 
{ 
    public bool CanHandle(RequestContext requestContext) 
    { 
     return requestContext.RouteData.DataTokens["area"].ToString().ToLowerInvariant() == "area51"; 
    } 
    public IController CreateController(RequestContext requestContext, string controllerName) 
    { 
     // create a controller... 
    } 

    public void ReleaseController(IController controller) 
    { 
     // release the controller... 
    } 

} 

तो फिर तुम MasterControllerFactory की जरूरत है, जो इस तरह दिखता है:

public class MasterControllerFactory : DefaultControllerFactory 
{ 
    private readonly List<IFilteredControllerFactory> _slaveFactories; 
    public MasterControllerFactory() 
    { 
     _slaveFactories = new List<IFilteredControllerFactory>(); 
    } 
    public void RegisterFactory(IFilteredControllerFactory slaveFactory) 
    { 
     if(slaveFactory!=null && !_slaveFactories.Contains(slaveFactory)) 
     { 
      _slaveFactories.Add(slaveFactory); 
     } 
    } 

    public override IController CreateController(RequestContext requestContext, string controllerName) 
    { 
     var factory = _slaveFactories.FirstOrDefault(x => x.CanHandle(requestContext)); 
     if(factory!=null) 
     { 
      return factory.CreateController(requestContext, controllerName); 
     } 
     return base.CreateController(requestContext, controllerName); 
    } 

    public override void ReleaseController(IController controller) 
    { 
     bool released = false; 
     if (controller is Controller) 
     { 
      var requestContext = ((Controller) controller).ControllerContext.RequestContext; 
      var factory = _slaveFactories.FirstOrDefault(x => x.CanHandle(requestContext)); 
      if (factory != null) 
      { 
       factory.ReleaseController(controller); 
       released = true; 
      } 
     } 
     if(!released)base.ReleaseController(controller); 
    } 
} 

public interface IFilteredControllerFactory:IControllerFactory 
{ 
    bool CanHandle(RequestContext requestContext); 
} 

एक कार्यान्वयन है कि क्षेत्र के नाम पर आधारित फ़िल्टर का एक उदाहरण इस तरह दिखता है

आपके global.asax के अनुप्रयोग_स्टार्ट में आपको अभी भी सब कुछ सेट अप करने की आवश्यकता है, लेकिन यह आसान है।

var masterControllerFactory = new MasterControllerFactory(); 
masterControllerFactory.Register(new Area51ControllerFactory()); 
ControllerBuilder.Current.SetControllerFactory(masterControllerFactory); 

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

-1

मुझे नहीं लगता कि आप इस क्षेत्र के प्रति अलग कारखाने हो सकता है, लेकिन आप अपने ही कारखाने में कर सकते हैं, अलग कंटेनर में नियंत्रक डाल दिया, क्षेत्र के आधार पर। मैं लेकिन नहीं जानते कि लगता है , तो आप इस पूछताछ की अपने कारखाने के CreateController विधि में अपने क्षेत्र पा सकते हैं कि:

requestContext.RouteData.DataTokens["area"]; 

जहां requestContext एक पैरामीटर के रूप CreateController को पारित कर दिया है।

+0

ओह हाँ आप कर सकते हैं ;-) – smartcaveman

+0

@smartcaveman: इस टिप्पणी को छोड़ने के लिए धन्यवाद - ऐसा करके आप मुझे अनुमति देते हैं 1) कुछ नया सीखना 2) आप को ऊपर उठाना =) –

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