2009-02-11 18 views
6

मैं अपने वेब ऐप में अपने आईओसी के रूप में निनजेक्ट का उपयोग कर रहा हूं। यह बहुत अच्छा है और मुझे लगता है कि यह वास्तव में अच्छी तरह से काम करता है, हालांकि मैं कुछ इंटरफेस/कक्षाओं को OnePerRequestBehaviour के रूप में पंजीकृत करने का प्रयास कर रहा हूं लेकिन वास्तव में यह व्यवहार का उपयोग नहीं करता है। कोड सही ढंग से चलता है लेकिन मेरी कक्षाओं में से एक में यह डेटाबेस से पृष्ठ की जानकारी को आलसी लोड करता है, फिर इसे लोड होने के बाद इसे डेटाबेस को हिट करने की आवश्यकता नहीं होती है।निंजा OnePerRequestBehaviour सही ढंग से काम नहीं कर रहा है?

मेरी समस्या यह है कि आलसी लोड की गई संपत्ति मेरे पहले अनुरोध में लोड हो जाएगी, जब मैं अगले पृष्ठ का अनुरोध करता हूं तो वर्ग का एक ही उदाहरण उपयोग किया जाता है। कारण मुझे यह पता है क्योंकि वर्ग को फिर से चालू नहीं किया गया है और आलसी लोड की गई संपत्ति पहले ही सेट हो चुकी है। मैं निम्नलिखित है

public class NinjectModule : StandardModule 
{ 
    public override void Load() 
    { 
     Bind<IUnitOfWorkDataStore>().To<HttpContextDataStore>().Using<OnePerRequestBehavior>(); 


     Bind<CmsService>().ToSelf().Using<OnePerRequestBehavior>(); 
     Bind<CmsRepository>().ToSelf().Using<OnePerRequestBehavior>(); 
    } 
} 
तब मेरे Global.asax जो NinjectHttpApplication से विरासत के अंदर

:

 protected override IKernel CreateKernel() 
     { 
      OnePerRequestModule module = new OnePerRequestModule(); 
      module.Init(this); 

      KernelOptions options = new KernelOptions(); 
      options.InjectNonPublicMembers = true; 

      IKernel kernel = new StandardKernel(options, new NinjectModule()); 

      return kernel; 
     } 

पहले CmsService के लिए किए गए कॉल के भीतर है

इस कोड को मेरी मॉड्यूल वर्ग के भीतर है global.asax पर प्रमाणीकरण_रेक्वेस्ट पर:

protected void Application_AuthenticateRequest(object sender, EventArgs e) 
     { 
      if (HttpContext.Current.Request.Url.AbsoluteUri.Contains(".aspx") && 
       !HttpContext.Current.Request.Url.AbsoluteUri.Contains(".aspx/")) 
      { 
       CmsService facCMS = HttpKernelFactory.Get<CmsService>(); 
       ContentPage page = facCMS.GetCurrentPage(); 

       // DO Logic based on the page being brought back 
      } 
     } 

टी वह GetCurrentPage ऊपर() कोड:

public ContentPage GetCurrentPage() 
{ 
    if (_currentPage != null) 
     return _currentPage; 

    return GetCurrentPage(_isAdmin); 
} 

तो जैसा कि आप देख सकते हैं _currentPage चर केवल लोड किया जाता है अगर यह पहले सेट नहीं किया गया है, जो एक बार अनुरोध के अनुसार होना चाहिए, हालांकि Ninject बनाने जा करने के लिए प्रतीत नहीं होता सीएमएस सेवा प्रति अनुरोध यह एक अनुचित समय के लिए इसे बनाने के लिए प्रतीत होता है।

देव किसी को भी कोई विचार नहीं है कि यह मेरे लिए क्यों काम नहीं कर रहा है या यह कोई उदाहरण कोड है जहां यह निश्चित रूप से काम करता है?

धन्यवाद

उत्तर

8

OnePerRequestModule एक HttpModule है, और काम करने के लिए अपने ASP.NET पाइपलाइन में लोड किया जाना चाहिए। आप अपने web.config में जोड़ने, तो यह काम करना चाहिए:

IIS7:

<system.webServer> 
    <modules> 
    <add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/> 
    </modules> 
</system.webServer> 

IIS6:

<system.web> 
    <httpModules> 
    <add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/> 
    </httpModules> 
</system.web> 

OnePerRequest व्यवहार बहुत (Ninject2 में सुधार हुआ है जो अभी तक हो रहा है जारी)।

+1

धन्यवाद पर स्पॉट, लेकिन फिर मुझे लगता है कि उत्तर निर्माता से गलत नहीं होगा! Ninject वास्तव में अच्छा है, मैं इसे प्यार करता हूँ। कोई विचार जब आप Ninject2 को जारी करने की उम्मीद करते हैं? –

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