5

मैं Simple Injector उपयोग कर रहा हूँ उपयोग करने के लिए सरल इंजेक्टर आईओसी कॉन्फ़िगर करने के लिए। मैं डाटा स्टोरेज के लिए RavenDB का उपयोग कर रहा हूं। एक एमवीसी 3 आवेदन में RavenDB का उपयोग करने पर कई विचार हैं। मैंने कुछ खोजा है कि कैसे एक IoC को RavenDB का उपयोग करने के लिए वायर-अप करना है, लेकिन यह पता नहीं चला है कि RavenDB का उपयोग करने के लिए सरल इंजेक्टर को वायर-अप कैसे करें। क्या कोई एमवीसी 3 वेब ऐप में रावेनडीबी का उपयोग करने के लिए सरल इंजेक्टर को वायर-अप करने का तरीका बता सकता है?कैसे एक MVC 3 वेब अनुप्रयोग में एक आईओसी के लिए RavenDB

धन्यवाद।

उत्तर

13

RavenDb tutorial के अनुसार, आपके आवेदन ठीक एक IDocumentStore उदाहरण की जरूरत है (डेटाबेस प्रति मुझे लगता है)। IDocumentStore थ्रेड-सुरक्षित है। यह IDocumentSession उदाहरणों पैदा करता है और वे RavenDB में एक unit of work प्रतिनिधित्व करते हैं, और उन नहीं धागा सुरक्षित हैं। आप धागे के बीच इसलिए नहीं शेयर सत्र चाहिए।

कैसे उपयोग के लिए अपने कंटेनर स्थापित करने के लिए साथ RavenDb मुख्य रूप से आवेदन डिजाइन पर निर्भर करता है। सवाल यह है कि आप उपभोक्ताओं को इंजेक्ट करना चाहते हैं? IDocumentStore, या IDocumentSession?

जब आप IDocumentStore साथ जाना, अपना पंजीकरण ऐसा दिखाई दे सकता:

// Composition Root 
IDocumentStore store = new DocumentStore 
{ 
    ConnectionStringName = "http://localhost:8080" 
}; 

store.Initialize(); 

container.RegisterSingle<IDocumentStore>(store); 

एक उपभोक्ता इस प्रकार दिखाई देंगे:

public class ProcessLocationCommandHandler 
    : ICommandHandler<ProcessLocationCommand> 
{ 
    private readonly IDocumentStore store; 

    public ProcessLocationCommandHandler(IDocumentStore store) 
    { 
     this.store = store; 
    } 

    public void Handle(ProcessLocationCommand command) 
    { 
     using (var session = this.store.OpenSession()) 
     { 
      session.Store(command.Location); 

      session.SaveChanges(); 
     }    
    } 
} 

क्योंकि IDocumentStore इंजेक्ट किया जाता है, उपभोक्ताओं को खुद के लिए जिम्मेदार हैं सत्र का प्रबंधन: निर्माण, बचत, और निपटान। यह छोटे अनुप्रयोगों के लिए बहुत सुविधाजनक है, या उदाहरण के लिए repository के पीछे RavenDb डेटाबेस को छिपाने के दौरान, जहां आप विधि के अंदर session.SaveChanges() पर कॉल करते हैं।

हालांकि, मुझे इस प्रकार के काम की एक इकाई का उपयोग बड़े अनुप्रयोगों के लिए समस्याग्रस्त होने के लिए मिला। तो आप इसके बजाय क्या कर सकते हैं, उपभोक्ताओं में IDocumentSession इंजेक्शन दे रहा है। उस मामले में अपना पंजीकरण ऐसा दिखाई दे सकता:

IDocumentStore store = new DocumentStore 
{ 
    ConnectionStringName = "http://localhost:8080" 
}; 

store.Initialize(); 

// Register the IDocumentSession per web request 
// (will automatically be disposed when the request ends). 
container.RegisterPerWebRequest<IDocumentSession>(
    () => store.OpenSession()); 

ध्यान दें कि आप की जरूरत Simple Injector ASP.NET Integration NuGet package (या अपनी परियोजना है, जो डिफ़ॉल्ट डाउनलोड में शामिल है के लिए SimpleInjector.Integration.Web.dll शामिल हैं) होने के लिए RegisterPerWebRequest विस्तार विधि का उपयोग करने में सक्षम।

सवाल अब हो जाता है, जहां session.SaveChanges() कॉल करने के लिए?

प्रति वेब अनुरोध कार्यों की इकाई को पंजीकृत करने के बारे में एक प्रश्न है, जो SaveChanges के बारे में प्रश्न भी संबोधित करता है। कृपया इस उत्तर पर एक अच्छा नज़र डालें: One DbContext per web request…why?। जब आप DbContextIDocumentSession और DbContextFactoryIDocumentStore के साथ शब्दों को प्रतिस्थापित करते हैं, तो आप इसे RavenDb के संदर्भ में पढ़ सकेंगे। ध्यान दें कि शायद RavenDb के साथ काम करते समय व्यापार लेनदेन या लेनदेन की धारणा महत्वपूर्ण नहीं है, लेकिन मैं ईमानदारी से नहीं जानता। यह ऐसा कुछ है जिसे आपको अपने लिए खोजना होगा।

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