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.
+1 Ninject facilita la tarea por solicitud como se responde mediante InRequestScope() http://bit.ly/HJADY3 – DalSoft
¿A dónde llama SaveChanges()? Intenté hacerlo en Application_EndRequest sin suerte. – Andrew
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. –