2012-03-01 17 views
11

Quiero usar RavenDB con ninject en mi proyecto asp.net mvc3, ¿Alguna idea de cómo tengo que configurar esto?RavenDB con Ninject en ASP.NET MVC3

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

Respuesta

25

Así es como lo hago mío:

Si instala Ninject con Nuget, obtendrá un archivo/App_start/NinjectMVC3.cs. Allí:

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

Ésta es la clase 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; 
    } 
} 

está completo y aquí está mi clase de la creación del í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 
    } 
} 

espero que esto ayude!

+0

+1 Ninject facilita la tarea por solicitud como se responde mediante InRequestScope() http://bit.ly/HJADY3 – DalSoft

+0

¿A dónde llama SaveChanges()? Intenté hacerlo en Application_EndRequest sin suerte. – Andrew

+0

Llamo SaveChanges() explícitamente cuando tiene sentido hacerlo, no automáticamente al final de cada solicitud. No estoy seguro de por qué tiene que hacer eso o por qué tiene problemas. Sospecho que tiene algo que ver con el orden de operaciones de Ninject con las dependencias de ámbito de solicitud, aunque no se puede decir sin información de diagnóstico. –

7

Recomiendo usar un proveedor de Ninject personalizado para configurar su almacén de documentos RavenDB. Primero coloque esto en su bloque de código que registra sus servicios de Ninject.

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

A continuación, agregue esta clase que implementa el Proveedor de 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; 
} 

El IDocumentStore es necesario que haya un conjunto unitario, pero no hacen la IDocumentSession un conjunto unitario. Te recomiendo que simplemente crees una nueva IDocumentSession usando OpenSession() en la instancia de IDocumentStore que Ninject te brinda cuando necesites interactuar con RavenDB. Los objetos IDocumentSession son muy livianos, siguen el patrón de unidad de trabajo, no son seguros para subprocesos y están destinados a ser utilizados y eliminados rápidamente cuando sea necesario.

Como han hecho otros, también podría considerar implementar un controlador base MVC que anule los métodos OnActionExecuting y OnActionExecuted para abrir una sesión y guardar los cambios, respectivamente.