6

मैं स्ट्रक्चर मैप का उपयोग करके अपने एमवीसी प्रोजेक्ट के लिए सेटर/प्रॉपर्टी इंजेक्शन सेट करने की कोशिश कर रहा हूं, लेकिन मुझे प्रॉपर्टी सेट करने के लिए यह प्रतीत नहीं होता है। मुझे अच्छी तरह पता है कि कन्स्ट्रक्टर इंजेक्शन अनुशंसित अभ्यास है, लेकिन मेरे पास सख्त आवश्यकता है जिसके लिए हम इसे सेटटर इंजेक्शन का उपयोग करके करते हैं, इसलिए कृपया मुझे अन्यथा बताने की कोशिश करने वाली टिप्पणियां रखें।स्ट्रक्चर मैप सेटर इंजेक्शन प्रॉपर्टी सेट नहीं कर रहा है

मैं ऐसे मेरी Global.asax में निम्नलिखित के रूप में सामान्य बॉयलरप्लेट सेटअप कोड है

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

ObjectFactory.Initialize(x => { 
      x.For<IPaymentService>().Use<PaymentService>(); 
      x.ForConcreteType<HomeController>().Configure.Setter<IPaymentService>(y => y.PaymentService).IsTheDefault(); 
      x.SetAllProperties(y => 
      { 
       y.OfType<IPaymentService>(); 
      }); 

     }); 

मेरे TestControllerFactory की तरह लग रहा है:

public class TestControllerFactory:System.Web.Mvc.DefaultControllerFactory 
{ 
    protected IController GetControllerInstance(Type controllerType) 
    { 
     if (controllerType == null) 
      throw new ArgumentNullException("controllerType"); 
     return ObjectFactory.GetInstance(controllerType) as IController ; 
    } 
} 

मैं निम्नलिखित सेवा/कार्यान्वयन वर्ग जोड़ी होती है

public interface IPaymentService 
{ 

} 

public class PaymentService:IPaymentService 
{ 

} 

और अंततः, मेरे पास नियंत्रक है जो wil {; सेट;}

public ActionResult Index(){ 
     var test = Service... //Service is Null 
} 

सार्वजनिक IPaymentService सेवा {मिल}

नियंत्रक :

सार्वजनिक वर्ग HomeController: एल संपत्ति ठोस भुगतान सेवा कार्यान्वयन यह में इंजेक्शन की जरूरत है कि है उपरोक्त दिखाया गया है, जब मैं डीबग करता हूं तो संपत्ति शून्य हो जाती है।

इसके अतिरिक्त, मैंने यह देखने के लिए [SetterProperty] का उपयोग करने का प्रयास किया है (यह मेरे गुणकों के साथ मेरे नियंत्रकों को युग्मित करने का कोई इरादा नहीं है), और यह अभी भी काम नहीं करता है।

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

+0

आप सेटर इंजेक्शन के साथ किसी भी नसीब था? मैं एक्शन फ़िल्टर पर कोशिश कर रहा हूं लेकिन यह काम भी प्रतीत नहीं होता है। – ntombela

+0

सेटर इंजेक्शन के साथ काम करने के लिए संघर्ष करने के बाद, मैंने इससे दूर जाने का फैसला किया। – Joel

उत्तर

3

इस लाइन छोड़ने का प्रयास करें:

x.ForConcreteType<HomeController>().Configure 
    .Setter<IPaymentService>(y => y.PaymentService).IsTheDefault(); 

यह आवश्यक नहीं होना चाहिए।

निम्नलिखित नियंत्रक को देखते हुए:

public class HomeController : Controller 
{ 
    public IMsgService Service { get; set; } 

    public ActionResult Index() 
    { 
     return Content(Service.GetMessage()); 
    } 
} 

यह था कि सभी StructureMap कॉन्फ़िगर करने के लिए गुण सेट करने की जरूरत पड़ी:

ObjectFactory.Initialize(cfg => 
{ 
    cfg.For<IMsgService>().Use<MyMsgService>(); 

    cfg.SetAllProperties(prop => 
    { 
     prop.OfType<IMsgService>(); 
    }); 
}); 

ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory()); 
+0

यह समाधान केवल तभी काम करता है जब संपत्ति 'नियंत्रक' वर्ग में है, मेरे मामले में संपत्ति 'गैर-नियंत्रक 'वर्ग है, इसलिए आपका उत्तर मेरी सहायता नहीं करेगा। –

+0

यह किसी भी अंतर * प्रदान नहीं करना चाहिए * आपने ऑब्जेक्ट ग्राफ़ में सभी निर्भरताओं के साथ स्ट्रक्चर मैप कॉन्फ़िगर किया है। –

+0

मैंने अपने कंट्रोलर में अपनी संपत्ति 'IUnitOfWork' डाल दिया है और यह मान प्राप्त करता है लेकिन जब मैं इसे किसी अन्य वर्ग' MyServiceFactory' में डालता हूं और अपने नियंत्रक में 'MyServiceFactory' क्लास को तुरंत चालू करता हूं तो' IUnitOfWork' प्रॉपर्टी 'शून्य' होती है। –