2012-03-01 17 views
11

में निनजेक्ट के साथ रावेनडीबी मैं अपने एएसपीनेट एमवीसी 3 प्रोजेक्ट में निन्जेक्ट के साथ रावेनडीबी का उपयोग करना चाहता हूं, कोई विचार मुझे इसे कैसे कॉन्फ़िगर करना है?एएसपी.नेट एमवीसी 3

 kernel.Bind<Raven.Client.IDocumentSession>() 
       .To<Raven.Client.Document.DocumentStore>() 
       .InSingletonScope() 
       .WithConstructorArgument("ConnectionString", ConfigurationManager.ConnectionStrings["RavenDB"].ConnectionString); 

उत्तर

25

यहां बताया गया है मैं मेरा कार्य करें:

आप Nuget साथ Ninject स्थापित हैं, तो आप एक/App_start/NinjectMVC3.cs फ़ाइल मिल जाएगा। वहाँ में:

private static void RegisterServices(IKernel kernel) 
    {    
     kernel.Load<RavenModule>(); 
    }  

यहाँ RavenModule वर्ग है:

public class RavenModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IDocumentStore>() 
      .ToMethod(InitDocStore) 
      .InSingletonScope(); 

     Bind<IDocumentSession>() 
      .ToMethod(c => c.Kernel.Get<IDocumentStore>().OpenSession()) 
      .InRequestScope(); 
    } 

    private IDocumentStore InitDocStore(IContext context) 
    { 
     DocumentStore ds = new DocumentStore { ConnectionStringName = "Raven" }; 
     RavenProfiler.InitializeFor(ds); 
     // also good to setup the glimpse plugin here    
     ds.Initialize(); 
     RavenIndexes.CreateIndexes(ds); 
     return ds; 
    } 
} 

और संपूर्णता के लिए यहाँ मेरी सूचकांक सृजन वर्ग है:

public static class RavenIndexes 
{ 
    public static void CreateIndexes(IDocumentStore docStore) 
    { 
     IndexCreation.CreateIndexes(typeof(RavenIndexes).Assembly, docStore); 
    } 

    public class SearchIndex : AbstractMultiMapIndexCreationTask<SearchIndex.Result> 
    { 
     // implementation omitted 
    } 
} 

मुझे आशा है कि इस मदद करता है!

+0

+1 निनजेक्ट इन अनुरोधों को सत्र में करना आसान बनाता है जैसा कि InRequestScope() http://bit.ly/HJADY3 – DalSoft

+0

का उपयोग करके उत्तर दिया गया है आप SaveChanges() कहां से कॉल करते हैं? मैंने इसे किसी भाग्य के साथ Application_EndRequest में करने की कोशिश की। – Andrew

+0

मैं SaveChanges() को स्पष्ट रूप से कॉल करता हूं जब ऐसा करने का अर्थ होता है, स्वचालित रूप से प्रत्येक अनुरोध के अंत में नहीं। मुझे यकीन नहीं है कि आपको ऐसा करने की आवश्यकता क्यों है या आपको समस्या क्यों आ रही है। मुझे संदेह है कि निनजेक्ट के संचालन के आदेश के साथ कुछ करने के लिए अनुरोध किया गया है, भले ही निर्भरता के आधार पर कुछ निदान जानकारी हो। –

7

मैं आपके RavenDB DocumentStore को स्थापित करने के लिए एक कस्टम निनजा प्रदाता का उपयोग करने की अनुशंसा करता हूं। सबसे पहले इसे अपने कोड ब्लॉक में रखें जो आपकी निंजा सेवाओं को पंजीकृत करता है।

kernel.Bind<IDocumentStore>().ToProvider<RavenDocumentStoreProvider>().InSingletonScope(); 

अगला, इस कक्षा को जोड़ें जो निंजा प्रदाता लागू करता है।

public class RavenDocumentStoreProvider : Provider<IDocumentStore> 
{ 
    var store = new DocumentStore { ConnectionName = "RavenDB" }; 
    store.Conventions.IdentityPartsSeparator = "-"; // Nice for using IDs in routing 
    store.Initialize(); 
    return store; 
} 

IDocumentStore को सिंगलटन होना चाहिए, लेकिन IDocumentSession को सिंगलटन न बनाएं। मैं अनुशंसा करता हूं कि आप IDocumentStore इंस्टेंस पर OpenSession() का उपयोग करके बस एक नया IDocumentSession बनाएं निनजेक्ट आपको जब भी आपको RavenDB से बातचीत करने की आवश्यकता हो, आपको देता है। IDocumentSession ऑब्जेक्ट्स बहुत हल्के होते हैं, यूनिट-ऑफ-वर्क पैटर्न का पालन करते हैं, थ्रेड-सुरक्षित नहीं होते हैं, और इसका उपयोग किया जाता है और जहां आवश्यक हो वहां जल्दी से निपटान किया जाता है।

जैसा कि अन्य ने किया है, आप आधार एमवीसी नियंत्रक को लागू करने पर भी विचार कर सकते हैं जो क्रमशः सत्र खोलने और परिवर्तनों को सहेजने के लिए ऑनएक्शन एक्स्क्रिप्टिंग और ऑनएक्शन एक्स्क्लेटेड विधियों को ओवरराइड करता है।

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