Pergunta

Quero usar RavenDB com ninject em meu projeto asp.net mvc3. Alguma ideia de como devo configurar isso?

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

Solução

Veja como eu faço o meu:

Se você instalar o Ninject com Nuget, obterá um arquivo /App_start/NinjectMVC3.cs.Lá:

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

Aqui está a classe 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;
    }
}

E para completar, aqui está minha classe de criação de índice:

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

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

Eu espero que isso ajude!

Outras dicas

Eu recomendo usar um provedor Ninject personalizado para configurar seu RavenDB DocumentStore.Primeiro coloque isso em seu bloco de código que registra seus serviços Ninject.

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

A seguir, adicione esta classe que implementa o Provedor 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;
}

O IDocumentStore precisa ser um singleton, mas não torne o IDocumentSession um singleton.Eu recomendo que você simplesmente crie um novo IDocumentSession usando OpenSession() na instância IDocumentStore que o Ninject fornece sempre que você precisar interagir com RavenDB.Os objetos IDocumentSession são muito leves, seguem o padrão de unidade de trabalho, não são thread-safe e devem ser usados ​​e descartados rapidamente quando necessário.

Como outros fizeram, você também pode considerar a implementação de um controlador MVC básico que substitua os métodos OnActionExecuting e OnActionExecuted para abrir uma sessão e salvar as alterações, respectivamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top