2012-04-25 8 views
24

मैंने एक नया एमवीसी वेब एप्लिकेशन बनाया है और मेरे पास Ninject.dll, Ninject.Web.Common.dll और Ninject.Web.MVC.dll के संदर्भ हैं।मैं एएसपी.नेट एमवीसी वेब ऐप में निनजेक्ट के साथ कैसे काम करूं?

Global.asax.cs:

public class MvcApplication : NinjectHttpApplication 
    { 
     public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
     { 
      filters.Add(new HandleErrorAttribute()); 
     } 

     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

     protected override IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      kernel.Load(Assembly.GetExecutingAssembly()); 
      return kernel; 
     } 

     protected override void OnApplicationStarted() 
     { 
      base.OnApplicationStarted(); 

      AreaRegistration.RegisterAllAreas(); 
      RegisterGlobalFilters(GlobalFilters.Filters); 
      RegisterRoutes(RouteTable.Routes); 
     } 
    } 

App_start \ NinjectWebCommon:

public static class NinjectWebCommon 
    { 
     private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule)); 
      DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule)); 
      bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
      kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

      RegisterServices(kernel); 
      return kernel; 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
     }   
    } 

मैं त्रुटि "अनुक्रम कोई तत्व शामिल हैं" मिलता है। मैं क्या गलत कर रहा हूं?

त्रुटि विवरण:

Description: An unhandled exception occurred during the execution of the current web request. Examine the stack trace for more information about this error and where it originated in the code. 

Exception Details: System.InvalidOperationException: Sequence contains no elements 

Source Error: 
    Unhandled exception occurred during execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 


Stack Trace: 

[InvalidOperationException: Последовательность не содержит элементов] 
    System.Linq.Enumerable.Single(IEnumerable`1 source) +320 
    Ninject.Web.Mvc.NinjectMvcHttpApplicationPlugin.Start() in c:\Projects\Ninject\ninject.web.mvc\mvc3\src\Ninject.Web.Mvc\NinjectMvcHttpApplicationPlugin.cs:53 
    Ninject.Web.Common.Bootstrapper.<Initialize>b__0(INinjectHttpApplicationPlugin c) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:52 
    Ninject.Infrastructure.Language.ExtensionsForIEnumerableOfT.Map(IEnumerable`1 series, Action`1 action) in c:\Projects\Ninject\ninject\src\Ninject\Infrastructure\Language\ExtensionsForIEnumerableOfT.cs:32 
    Ninject.Web.Common.Bootstrapper.Initialize(Func`1 createKernelCallback) in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\Bootstrapper.cs:52 
    Ninject.Web.Common.NinjectHttpApplication.Application_Start() in c:\Projects\Ninject\Ninject.Web.Common\src\Ninject.Web.Common\NinjectHttpApplication.cs:80 
+0

आप पूर्ण स्टैकट्रेस जोड़ सकते हैं? –

+0

मैं अपनी पोस्ट को अद्यतन – Mediator

+0

[लाइन 53] (https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src/Ninject.Web.Mvc/N injectMvcHttpAplicationPlugin.cs # L53) एमवीसी से [DataAnnotationsModelValidatorProvider] (http://msdn.microsoft.com/en-us/library/system.web.mvc.dataannotationsmodelvalidatorprovider.aspx) को हटाने का प्रयास कर रहा है। क्या आप एमवीसी के सही संस्करण का उपयोग कर रहे हैं/क्या आपने इसे किसी भी तरीके से कॉन्फ़िगर किया है? – Rup

उत्तर

24

आप NinjectHttpApplication से पाने रहे हैं और आप एक ही समय में App_Start उपयोग कर रहे हैं। एक चुनो! अधिक जानकारी के लिए docu of Ninject.MVC3 पढ़ें।

+0

आह, साफ-सुथरा - इसलिए वह डेटा एन्नोटेशन को हटाने के बारे में त्रुटि देख रहा है। मॉडल validatorProvider यह है कि वह दूसरी बार निनजेक्ट शुरू कर रहा है और पहले init पहले से ही इसे हटा दिया है? मुझे लगता है कि यह एक उपयोगी पकड़ है लेकिन शायद यह अधिक शानदार ढंग से असफल हो सकता है – Rup

+5

@ रेमो ग्लोर - मुझे कहना है कि इन दो अलग-अलग दृष्टिकोण शुरुआत के लिए भी दस्तावेज के साथ अविश्वसनीय रूप से भ्रमित हैं। प्रलेखन वास्तव में अनिवार्य रूप से कहता है कि 'वे बिल्कुल वही हैं' लेकिन कोड को देखकर नूजेट के पास एक खाली 'रजिस्टर सर्विसेज' विधि है और NinjectHttp अनुप्रयोग के तरीके में 'कर्नल.लोड (असेंबली.गेटएक्सिंगिंगएस्सेबी) है। ये दस्तावेज के उस पृष्ठ पर समान और अधिक मार्गदर्शन नहीं हैं, इसकी बहुत सराहना की जाएगी। यह निनजेक्ट पर मिलने वाले पहले पृष्ठों में से एक है और कुछ और विवरण शुरुआती –

+0

@Simon_Weaver के लिए पंजीकरण होगा, पंजीकरण कोड के समान कार्यान्वयन के लिए NinjectHttp आवेदन विधि में रजिस्टर सर्विसेज विधि जोड़ा गया है। अब यह वास्तव में वही है। यदि आपको अधिक जानकारी चाहिए तो उन्हें अपनी राय में जो कुछ भी गुम है, उसे जोड़ें या अगर आप उत्तर जानते हैं तो इसे स्वयं जोड़ें। –

39

इस बारे में स्पष्ट रूप से स्पष्ट है कि, अगर आप NuGet 'Ninject.Mvc3' पैकेज जोड़ने के लिए उपयोग (मैं संस्करण 3.0.0.6 प्रयुक्त), global.asax.cs में कोई संशोधन न बनाने के लिए कोई जरूरत नहीं है। आपके एमवीसी 4 प्रोजेक्ट के App_Start फ़ोल्डर में NinjectWebCommon कक्षा बनाकर NuGet पैकेज आपके लिए जादू करता है।

मैं यह कहता हूं क्योंकि मुझे मूल पोस्टर के समान ट्यूटोरियल का पालन करना प्रतीत होता है (मैंने कोड प्रोजेक्ट पर एक लेख का पालन किया जिसे 'Dependency Injection in asp.net mvc4 and webapi using Ninject' कहा जाता है), और मूल पोस्टर के समान ही समस्या थी। Code Project लेख नहीं है यह स्पष्ट आप या तो उपयोग NuGet (और स्पर्श करना चाहिए नहीं global.asax.csया मैन्युअल Ninject संदर्भ जोड़ें (और global.asax.cs संशोधन) कि।

7

सुनिश्चित करें कि आप एक को संदर्भित नहीं कर रहे हैं हो सकता है परियोजना जो भी NinjectMVC3 App_Start। का उपयोग करता है इस तरह के के संदर्भ हटाने के बाद, अपने प्रोजेक्ट काम कर रहे। इसके अलावा शुरू कर दिया, के रूप में पहले कहा, नामस्थान सभी मैच की जाँच करें और सही हैं।

+0

यह मेरी सही समस्या थी। संकेत के लिए धन्यवाद! – code5

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

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