2010-03-14 8 views
5

मेरे वेब अनुप्रयोग समाधान 3 परियोजनाओं के होते हैं मैं Database Layer में Entity Framework द्वारा उत्पन्न DataContext के जीवनकाल को प्रबंधित करने के लिए निनजेक्ट का उपयोग करना चाहता हूं।निर्भरता इंजेक्शन कितनी दूर तक पहुंचता है?</p> <ol> <li>वेब एप्लिकेशन (ASP.NET MVC)</li> <li>व्यापार तर्क लेयर (कक्षा लाइब्रेरी)</li> <li>डाटाबेस लेयर (इकाई की रूपरेखा)</li> </ol> <p>:

बिजनेस लॉजिक लेयर में कक्षाएं होती हैं जो संदर्भ भंडार (डेटाबेस परत में स्थित) और मेरे एएसपी.नेट एमवीसी ऐप कोड चलाने के लिए व्यवसाय तर्क परत की सेवा कक्षाओं का संदर्भ देती है। प्रत्येक भंडार इकाई की रूपरेखा

भंडार से MyDataContext वस्तु का एक उदाहरण बनाता

public class MyRepository 
{ 
    private MyDataContext db; 
    public MyRepository 
    { 
     this.db = new MyDataContext(); 
    } 

    // methods 
} 

व्यापार तर्क वर्ग

public class BizLogicClass 
{ 
    private MyRepository repos; 
    public MyRepository 
    { 
      this.repos = new MyRepository(); 
    } 

    // do stuff with the repos 
} 

विल Ninject वेब से लंबा निर्भरता श्रृंखला के बावजूद MyDataContext के जीवनकाल को संभालने डेटा परत के लिए ऐप?

उत्तर

3

संपादित

मैं कुछ समय पहले इसके साथ कुछ समस्या है, लेकिन अब यह काम करने के लिए लगता है: आप OnePerRequestBehavior उपयोग कर सकते हैं और यह ध्यान रखना होगा,

Bind<CamelTrapEntities>().To<CamelTrapEntities>().Using<OnePerRequestBehavior>(); 

इसके बजाय HttpModule का उपयोग करने का वर्तमान अनुरोध में संदर्भ संभालना।

संपादित 2

OnePerRequestBehavior, web.config में पंजीकृत होने के लिए, क्योंकि यह बहुत HttpModule पर निर्भर करता है की जरूरत है:

IIS6 में:

<system.web> 
    <httpModules> 
    <add name="OnePerRequestModule" type="Ninject.Core.Behavior.OnePerRequestModule, Ninject.Core"/> 
    </httpModules> 
</system.web> 
IIS7 के साथ

:

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

पिछला उत्तर

इसकी आवश्यकता होने पर संदर्भ का निपटान करना आपकी ज़िम्मेदारी है। एएसपी.नेट में सबसे लोकप्रिय तरीका प्रति ऑब्जेक्ट कॉन्टेक्स्ट है। मैं होने HttpModule द्वारा यह कार्य करें:

public Repository(CamelTrapEntities ctx) 
{ 
    _ctx = ctx; 
} 
+0

क्या "काम करने के लिए लगता है" क्या मतलब है? – jfar

+0

@jfar: मैं इसे कुछ पलों पहले देखता हूं और कर्नेल को बुलाता हूं। <<दो बार मुझे अनुरोध में एक ही उदाहरण दिया। मुझे याद नहीं है कि पहले क्या समस्याएं थीं, लेकिन किसी भी तरह मैंने इसका इस्तेमाल न करने का फैसला किया। इस बीच मैंने नए स्रोत डाउनलोड किए, लेकिन आज तक इसे जांच नहीं लिया, इसलिए इसे उचित रूप से सही किया गया। – LukLed

3

बस Autofac with the ASP.Net integration अनुरोध जीवन भर है कि उल्लेख करना चाहते हैं:

Bind<CamelTrapEntities>().ToMethod(c => (CamelTrapEntities) HttpContext.Current.Items[@"CamelTrapEntities"]); 

मेरे भंडार निर्माता में ObjectContext लेता है:

public class CamelTrapEntitiesHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication application) 
    { 
     application.BeginRequest += ApplicationBeginRequest; 
     application.EndRequest += ApplicationEndRequest; 
    } 

    private void ApplicationEndRequest(object sender, EventArgs e) 
    { 
     ((CamelTrapEntities) HttpContext.Current.Items[@"CamelTrapEntities"]).Dispose(); 
    } 

    private static void ApplicationBeginRequest(Object source, EventArgs e) 
    { 
     HttpContext.Current.Items[@"CamelTrapEntities"] = new CamelTrapEntities();    
    } 
} 

यह इंजेक्शन नियम है अंतर्निहित समर्थन।RequestContainer में उदाहरणों को हल करें और अनुरोध के अंत में उनका निपटान किया जाएगा (यदि आईडीस्पोज़ेबल लागू किया जा रहा है)।

आप अपनी कक्षाओं डि अनुकूल बनाना चाहिए, हालांकि:

public class MyRepository 
{ 
    private MyDataContext db; 
    public MyRepository(MyDataContext context) 
    { 
     this.db = context; 
    } 

    // methods 
} 

public class BizLogicClass 
{ 
    private MyRepository repos; 
    public BizLogicClass(MyRepository repository) 
    { 
      this.repos = repository; 
    } 

    // do stuff with the repos 
} 
संबंधित मुद्दे