6

के साथ निदान मैं अपने विंडोज़ एप्लिकेशन में निनजेक्ट का उपयोग करना चाहता हूं और मैं जानना चाहता हूं कि क्या सर्वोत्तम अभ्यास है जो मैं कर सकता हूं; प्रदर्शन और रखरखाव के बीच संतुलन खोजने के लिए रणनीतियों।विंडोज अनुप्रयोग

विंडोज एप्लिकेशन और वेब अनुप्रयोग के साथ समस्या यह है कि वेब अनुप्रयोग में, यह परिभाषित करने के लिए एक दायरा आसान है कि संदर्भ है लेकिन विंडोज़ एप्लिकेशन के साथ, आपके पास फॉर्म के बाद फॉर्म का उपयोग करना आसान नहीं है।

उदाहरण के तौर पर, मेरे पास एक सेवा है जो डेटाबेस से पूछताछ करती है। इस सेवा में एक निर्माता है और एक यूनिटऑफवर्क प्राप्त किया है। निनजेक्ट के साथ, मैं इंजेक्शन के रूप में चिह्नित एक संपत्ति बना सकता हूं लेकिन यदि मैं ऐसा करता हूं, हर बार जब मैं यह सेवा तैयार करूंगा, तो डेटाबेस में एक नया कनेक्शन बनाया जाएगा।

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

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

उत्तर

5

निनजेक्ट के साथ, आप किसी भी ऑब्जेक्ट को प्रदान करने के लिए अपनी इंजेक्शन निर्भरताओं के निनजेक्ट स्कोप जीवनकाल प्राप्त कर सकते हैं (न केवल सिंगलटन, अनुरोध, थ्रेड और क्षणिक स्कॉप्स)।

Ninject Documentation Wiki से:

तुम भी आसानी से आप .InScope (वस्तु ओ) पद्धति का उपयोग करके स्कोप ही परिभाषित कर सकते हैं।

आपको this Ninject Google Groups question & answer में ऑब्जेक्ट स्कोपिंग कैसे काम करता है इसके बारे में कुछ वास्तविक विवरण मिलेगा।

+2

+1 और संबंधित लिंक http://kohari.org/2009/03/06/cache-and-collect-lifecycle-management-in-ninject-20/ निंजा 2.0 स्कॉप्स –

+0

को समझने के लिए पढ़ना आवश्यक है, लिंक्ड लेख पढ़ने के बाद, अब मैं बेहतर समझता हूं कि मैं इंजेक्शन वाले आश्रित वस्तुओं के जीवनकाल को कैसे नियंत्रित कर सकता हूं। यह अच्छा है लेकिन एक महान वास्तुकला के बिना, यह बनाए रखने के लिए अजीब हो सकता है। ऐसा प्रतीत होता है कि वेब पर बहुत कम लोग एक अच्छा विंडोज एप्लिकेशन कैसे डिज़ाइन करते हैं और Winform में ऑब्जेक्ट का दायरा कैसे शुरू करें, इस बात को ध्यान में रखते हुए कि कई अन्य रूप एक साथ काम कर सकते हैं, इस बारे में युक्तियां देते हैं। मैं माइंडस्केप के लाइटस्पीड और यूनिटऑफवर्क का उपयोग कैश का उपयोग करता हूं और जब आपके पास कई Winforms हैं जो एक साथ काम करते हैं, तो डेटा को अक्सर साझा किया जाना चाहिए। किसी भी शरीर के पास परियोजना का ठोस नमूना है? – Samuel

+0

@ सैमुएल, ईमानदार होने के लिए, मैंने कंक्रीट नमूना अनुप्रयोगों के रास्ते में बहुत कुछ नहीं देखा है जो एक अच्छी तरह से आर्किटेक्टेड अनुप्रयोग में नियोजित ओआरएम और यूनिटऑफवर्क के साथ विंडोज फॉर्म दिखाते हैं। अगर मैं कभी भी किसी को ढूंढ सकूं तो मैं निश्चित रूप से उन्हें खुद देखना चाहूंगा। –

2

This article by Ayende in MSDN Magazine जाहिरा तौर पर NHibernate के बारे में है, और शब्द का उल्लेख है केवल एक बार इंजेक्षन (और केवल AOP WRT कि), लेकिन आपके प्रश्न के शब्दों में मेरे लिए चलता है कि यह विचार के लिए महान भोजन हो जाएगा के रूप में आप पर विचार अपने ऐप वास्तुकार के ।

0

आप अपने ढांचे को कारखाने के उदाहरण पर भी निर्भर कर सकते हैं, और अपने कनेक्शन पूलिंग करने के लिए कारखाने पर भरोसा कर सकते हैं।

वैकल्पिक रूप से, आप विशेष प्रकार के लिए हमेशा उसी ऑब्जेक्ट उदाहरण का उपयोग करने के लिए निनजेक्ट का उपयोग कर सकते हैं।

3

आखिरकार मैंने जो खोजा वह मुझे मिला।

एक वर्ग है कि से विरासत '(टी का) Ninject.Activation.Provider'

बनाएं Overrrides समारोह 'CreateInstance'

कि 'बाइंड के साथ अपने इंटरफेस बाइंड

(के [आपका इंटरफेस])। ToProvider ([आपका प्रदाता वर्ग]) '

और अब, आप निर्दिष्ट इंटरफ़ेस से जुड़े प्रत्येक इंस्टेंस को नियंत्रित करने में सक्षम होंगे।

ध्यान दें कि आप बाइंड विधि के प्रदाता पैरामीटर में एक प्रकार या उदाहरण पास कर सकते हैं। जब आप एक नया उदाहरण बनाना चाहते हैं तो आप अपने इंटरफेस को बाध्य करने से पहले एक प्रदाता बना सकते हैं और इस प्रदाता को अपने कोड में इस्तेमाल कर सकते हैं।

इनस्कोप के साथ प्रदाता प्रदाता प्रत्येक स्थान के लिए बहुत लचीलापन देता है जहां आप चाहते हैं और उस ऑब्जेक्ट का उदाहरण जिसे स्वचालित रूप से इंजेक्शन दिया जा सकता है और निर्धारित स्कोप हो।

यहाँ एक उदाहरण है:

Public Interface IConnection 

End Interface 

Public Class Connection 
    Implements IConnection 

End Class 

Imports Ninject 

Public Class StandardModule 
    Inherits Ninject.Modules.NinjectModule 

    Public Property ConnectionProvider As ConnectionProvider 

    Public Overrides Sub Load() 
     Bind(Of IConnection).ToProvider(Me.ConnectionProvider) 
    End Sub 
End Class 

Public Class ConnectionProvider 
    Inherits Ninject.Activation.Provider(Of IConnection) 

    Public Property Connection As IConnection 

    Protected Overrides Function CreateInstance(ByVal context As Ninject.Activation.IContext) As IConnection 
     Return Me.Connection 
    End Function 
End Class 

Imports Ninject 

Module EntryPoint 
    Sub Main() 
     Dim provider As New ConnectionProvider 
     Dim standardModule As New StandardModule 
     Dim connection As IConnection 
     Dim kernel As New Ninject.StandardKernel() 

     standardModule.ConnectionProvider = provider 

     kernel = New Ninject.StandardKernel(standardModule) 

     ' Here you should use a factory instead of create an instance directly but 
     ' for demonstration, it show how an instance can be propagated to object created 
     ' by NInject. 
     provider.Connection = New Connection 

     connection = kernel.Get(Of IConnection)() 
    End Sub 
End Module 
+0

सुनकर अच्छा लगा कि आपको लगता है कि आपके पास जवाब है। जब तक आपके पास पूर्ण लैम्ब्डा विधियां हों (वर्क एक्स (2010?) तक वीबी में अधूरा, एक आम तौर पर बाइंड का उपयोग करता है। टोम विधि() - यदि आपके पास वास्तव में कक्षा की आवश्यकता के लिए पर्याप्त जटिल है, तो आमतौर पर आपको इसे एक कंटेनर के रूप में करना चाहिए - आपके डोमेन तर्क के अपने हिस्से के रूप में नैदानिक ​​चीज। लेकिन यदि आपके पास उचित लैम्ब्स नहीं है तो यह निश्चित रूप से एक जगह है, esp। –