ASP.NET MVC3中使用Ninject的RavenDB

时间:2012-03-01 17:44:35

标签: asp.net-mvc-3 ravendb ninject.web.mvc

我想在我的asp.net mvc3项目中使用带有ninject的RavenDB,不知道我该如何配置它?

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

2 个答案:

答案 0 :(得分: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
    }
}

我希望这有帮助!

答案 1 :(得分:7)

我建议使用自定义Ninject Provider来设置RavenDB DocumentStore。首先将它放在注册Ninject服务的代码块中。

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

接下来,添加实现Ninject Provider的这个类。

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交互,Ninject就会为您提供。 IDocumentSession对象非常轻量级,遵循工作单元模式,不是线程安全的,并且可以在需要时使用并快速处理。

正如其他人所做的那样,您也可以考虑实现一个基础MVC控制器,它覆盖OnActionExecuting和OnActionExecuted方法,分别打开会话并保存更改。