2016-02-29 7 views
7

मैं वर्तमान में वेबसाइट के लिए एक नई कार्यक्षमता सहित काम कर रहा हूं।एंटिटी फ्रेमवर्क डीबीकॉन्टेक्स्ट के साथ निर्भरता इंजेक्शन का उपयोग कैसे करें?

मेरे पास एक डीबीकॉन्टेक्स्ट क्लास है जिसे मैंने ईएफ 6 का उपयोग करके बनाया है।

वेबसाइट एक मास्टर लेआउट का उपयोग करती है जिसमें अनुरोध किए गए पृष्ठ पर उपन्यास प्रस्तुत किए जाते हैं। मैं Sublayouts में DbContext तक पहुंचने के लिए निर्भरता इंजेक्शन का उपयोग करना चाहता हूं। आम तौर पर, मैं कॉल को संभालने के लिए नियंत्रक का उपयोग करता हूं, हालांकि, मैं इस मामले में इसे छोड़ना चाहता हूं।

इसके अलावा, मैं कार्यान्वयन को लचीला रखना चाहता हूं ताकि नए डीबीकॉन्टेक्स जोड़े जा सकें, मैं उन्हें आसानी से उपयोग करने में सक्षम हूं।

मैं एक इंटरफेस "आईडीबीकॉन्टेक्स्ट" बनाने की सोच रहा था।

मेरे पास इस इंटरफ़ेस को लागू करने वाला नया इंटरफ़ेस होगा (चलो "आईरेटिंग्स")।

क्या मैं इसके बारे में सही तरीके से जा रहा हूं?

कोई विचार?

+0

कुछ भी नहीं है 'के बारे में EF' वास्तव में विशेष: तो आप बस अपने नियंत्रक में IDbContext इंजेक्षन और using के बिना सामान्य रूप में इसका इस्तेमाल की जरूरत है। बस ध्यान रखें कि 'डीबीकॉन्टेक्स्ट'' आईडीस्पोज़ेबल 'है, इसलिए आपको मुझे याद दिलाने के लिए किसी भी तरह – Szer

+1

@Szer धन्यवाद का जीवनकाल प्रबंधित करना होगा। हाँ, मुझे इसके बारे में पता है। मैं सिर्फ यह जानना चाहता था कि ऐसा कैसे करें? – omkarshukla

उत्तर

5

मैं सरल इंजेक्टर पसंद करता हूं लेकिन यह किसी भी अन्य आईओसी कंटेनर के लिए इतना अलग नहीं होगा।

अधिक जानकारी here

ASP.Net4 के लिए उदाहरण:

// You'll need to include the following namespaces 
using System.Web.Mvc; 
using SimpleInjector; 
using SimpleInjector.Integration.Web; 
using SimpleInjector.Integration.Web.Mvc; 

    // This is the Application_Start event from the Global.asax file. 
    protected void Application_Start() 
    { 
     // Create the container as usual. 
     var container = new Container(); 
     container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

     // Register your types, for instance: 
     container.Register<IDbContext, DbContext>(Lifestyle.Scoped); 

     // This is an extension method from the integration package. 
     container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 

     // This is an extension method from the integration package as well. 
     container.RegisterMvcIntegratedFilterProvider(); 

     container.Verify(); 

     DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 
    } 

इस तरह के पंजीकरण हर WebRequest प्रति DbContext बना सकते हैं और आप के लिए यह बंद हो जाएगा।

public class HomeController : Controller 
{ 
    private readonly IDbContext _context; 

    public HomeController(IDbContext context) 
    { 
     _context = context; 
    } 

    public ActionResult Index() 
    { 
     var data = _context.GetData(); 
     return View(data); 
    } 
} 
+0

धन्यवाद @ Szer! यह वास्तव में वही है जो मैंने किया है। हम एक एमवीपी ढांचे का उपयोग करते हैं। यह Application_Start विधि में प्रारंभ होता है। मैंने एक नया वर्ग रेटिंग्स कॉन्टेनरबिल्डर बनाया, जो कि आईओसी कक्षा का उपयोग करने वाले आईओसी कक्षा IInversionOfControlContainerBuilder से लिया गया है। ओवरलोडेड विधि में बिल्ड करें, मैं इस प्रकार को स्कॉप्स के साथ इनवर्जनऑफ कंट्रोलस्कोप.पियरहट्प सत्र स्कोप के रूप में पंजीकृत करता हूं। क्या यह ठीक लगता है? – omkarshukla

+0

@omkarshukla हाँ, ठीक लगता है। हालांकि मैंने ऐसे आईओसी कंटेनर के साथ काम नहीं किया है, लेकिन PerHttpSessionScope उचित लगता है। यह काम नहीं करता है या क्या? – Szer

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