2012-03-01 16 views
11

私はasp.net mvc3プロジェクトでninjectとRavenDBを使いたいと思っています。どのように設定する必要がありますか?RavenDB with Ninject with ASP.NET MVC3

 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()は、各リクエストの最後に自動的にではなく、そうするのが賢明なときに明示的に呼び出します。なぜそれをする必要があるのか​​、なぜ問題があるのか​​わかりません。私は、それが何らかの診断情報なしでは何も伝えていないのに、リクエストスコープの依存関係を持つNinjectの操作の順序と関係があると考えています。 –

7

カスタムNinjectプロバイダを使用してRavenDB DocumentStoreをセットアップすることをおすすめします。まず、Ninjectサービスを登録するコードブロックに配置します。

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

次に、Ninjectプロバイダを実装するこのクラスを追加します。

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をシングルトンにしないでください。 NinjectはRavenDBと対話する必要があるときはいつでも、IDocumentStoreインスタンスでOpenSession()を使用して新しいIDocumentSessionを作成することをお勧めします。 IDocumentSessionオブジェクトは非常に軽量であり、作業単位のパターンに従い、スレッドセーフではなく、必要に応じて使用され、素早く処理されます。

他にも、セッションを開いて変更を保存するために、OnActionExecutingメソッドとOnActionExecutedメソッドをオーバーライドする基本MVCコントローラを実装することをお勧めします。ここで