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?। जब आप DbContext
IDocumentSession
और DbContextFactory
IDocumentStore
के साथ शब्दों को प्रतिस्थापित करते हैं, तो आप इसे RavenDb के संदर्भ में पढ़ सकेंगे। ध्यान दें कि शायद RavenDb के साथ काम करते समय व्यापार लेनदेन या लेनदेन की धारणा महत्वपूर्ण नहीं है, लेकिन मैं ईमानदारी से नहीं जानता। यह ऐसा कुछ है जिसे आपको अपने लिए खोजना होगा।