5

मैं मैं पहले से ही NuGet का उपयोग कर लिया है ASP.NET MVC3 के लिए StructureMap विन्यास के लिए कैसे लगाने की कोशिश कर रहा हूँ और मुझे लगता है कि यह StructuremapMVC के रूप में नामित एक सीएस फ़ाइल के साथ App_Start फ़ोल्डर बनाता नोटिस के माध्यम से StructureMap और MVC3 कोशिश, तो मैं जाँच यह और नोटिस एक ही कोड लेकिन सरलीकृत कि Global.asax पर रखा App_Start खंड पर मैन्युअल रूप से लिखा जाएगा है कि ...पहले NuGet

यह आईओसी कक्षा से मेरे कोड है

public static class IoC 
    { 
     public static IContainer Initialize() 
     { 
      ObjectFactory.Initialize(x => 
         { 
          x.Scan(scan => 
            { 
             scan.TheCallingAssembly(); 
             scan.WithDefaultConventions(); 
             scan.AddAllTypesOf<IController>(); 
            }); 
          x.For<OpcionDB>().Use(() => new DatabaseFactory().Get()); 
         }); 
      return ObjectFactory.Container; 
     } 
    } 

मेरा प्रश्न है मैं क्यों मिलता एक अपवाद जब मैं अपने नियंत्रकों पर कुछ आईओसी इंजेक्ट करता हूं (मैं इस पैटर्न का उपयोग करता हूं: Entity Framework 4 CTP 4/CTP 5 Generic Repository Pattern and Unit Testable):

 private readonly IAsambleaRepository _aRep; 
     private readonly IUnitOfWork _uOw; 

     public AsambleaController(IAsambleaRepository aRep, IUnitOfWork uOw) 
     { 
      _aRep = aRep; 
      this._uOw = uOw; 
     } 

     public ActionResult List(string period) 
     { 
      var rs = _aRep.ByPeriodo(period).ToList<Asamblea>(); 

      return View(); 
     } 

अपवाद पता चला:

Exception Details: System.MissingMethodException: No parameterless constructor defined for this object. 

उत्तर

3

आप उस त्रुटि हो रही है: यदि आप अपने समाधान में एक अलग परियोजना में अपनी सेवाओं और खजाने है, तो आप इस तरह यह जोड़ने की आवश्यकता होगी AsambleaController इसलिए यह एक पैरामीटर रहित कन्स्ट्रक्टर खोजने की कोशिश करता है जो एक नहीं है।

तो आपको IAsambleaRepository और IUnitOfWork के लिए संरचना संरचना मैप करने की आवश्यकता है।

एक तरफ नोट पर, मैं कहूंगा कि IUnitOfWork आपके भंडार पर निर्भरता होनी चाहिए, न कि आपके नियंत्रक ... आपके नियंत्रक को काम की इकाई के बारे में जानने की आवश्यकता नहीं है।

4

नियंत्रक के निर्माता में पैरामीटर को करने के लिए, निर्भरता समाधानकर्ता कॉन्फ़िगर किया जाना चाहिए।

कैसे ASP.NET MVC3 साथ StructureMap ऊपर तार से जोड़ पर निम्नलिखित पोस्ट की जाँच करें:

http://stevesmithblog.com/blog/how-do-i-use-structuremap-with-asp-net-mvc-3/

http://codebetter.com/jeremymiller/2011/01/23/if-you-are-using-structuremap-with-mvc3-please-read-this/

2

आप भंडार पर पोस्ट का अनुसरण किया है कि वह इन्हें आपको विन्यास जोड़ना चाहते हैं जाएगा अपने IoC.cs फ़ाइल:

x.For<IUnitOfWork>().HttpContextScoped().Use<UnitOfWork>(); 
x.For<IDatabaseFacroey>().HttpContextScoped().Use<DatabaseFactory>(); 
x.For<IAsambleaRepository >().HttpContextScoped().Use<AsambleaRepository>(); 

कॉल करने के लिए: scan.TheCallingAssembly(); केवल एमवीसी परियोजना को देखेंगे। क्योंकि आप निर्भरता contruct करने की जरूरत को हल करने नहीं सेटअप StructureMap है

scan.Assembly("Your.Assembly"); 
1

डीबग में चलाएं, आपको शायद स्ट्रक्चर मैप आईओसी रिज़ॉल्यूशन त्रुटि मिल रही है।

असली रिज़ॉल्यूशन त्रुटि प्राप्त करने के बजाय आप इस संदेश को इसके बजाय प्रदर्शित करते हैं। लाइनों के साथ कहीं भी एमवीसी पाइपलाइन वास्तविक त्रुटि निगलती है।

2

संरचना मैप.एमवीसी 3 की NuGet स्थापना फ़ोल्डर निर्भरताResolution में SmDependencyResolver.cs नामक एक फ़ाइल स्थापित करती है। आप देखेंगे कि वहां GetService विधि का प्रयास है ... पकड़ लें कि अपवाद होने पर बस शून्य हो जाता है। यह अपवाद के विवरण को दबा सकता है ताकि आप इसके बजाय "कोई पैरामीटर रहित कन्स्ट्रक्टर" के बारे में त्रुटि संदेश को देख सकें।

मूल अपवाद के बारे में अधिक जानकारी प्राप्त करने के लिए आप मूल अपवाद के विवरण को थूकने के लिए उस पकड़ खंड में कुछ जोड़ सकते हैं - उदाहरण के लिए डीबग।यहां लिखें:

public object GetService(Type serviceType) 
    { 
     if (serviceType == null) return null; 
     try 
     { 
      return serviceType.IsAbstract || serviceType.IsInterface 
        ? _container.TryGetInstance(serviceType) 
        : _container.GetInstance(serviceType); 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine(ex.ToString()); 
      return null; 
     } 
    } 

इससे आपको समस्या के स्रोत को ट्रैक करने में मदद मिल सकती है।

+0

+1: इससे मेरी मदद मिली। धन्यवाद। –

+0

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