2011-04-01 15 views
8

NOTA: Hay 3 preguntas aquí y no formulé preguntas por separado, ya que todas están relacionadas con el mismo código.ASP.NET MVC 3, RavenDB, y Autofac Issue Plus 2 Otras preguntas de Autofac

tengo el siguiente código que registra la conexión a mi RavenDB en el Application_Start vez por ciclo de vida de la aplicación:

var store = new DocumentStore { Url = "http://localhost:8080" }; 
store.Initialize(); 

builder.RegisterInstance(store).SingleInstance(); 

Ahora bien, esto funciona bien y esto es algo que debe ser creado sólo una vez por la ciclo de vida de la aplicación. Ahora quería añadir en el DocumentSession a Autofac así que traté de añadir en este en el Application_Start:

var session = store.OpenSession(); 
builder.RegisterInstance(session).SingleInstance(); 

En mi UserRepository tengo el siguiente constructor:

public UserRepository(DocumentStore store, DocumentSession session) 

Cuando trato de ejecutar este , me sale el error de seguimiento en tiempo de ejecución:

no se puede resolver el parámetro 'Raven.Client.Document.DocumentSession Sesión' del constructor '.ctor Vacío (Raven.Client.Document.DocumentStore, Raven.Client.Document.DocumentSession)'

Ese error me parece que Autofac no cree que tenga una DocumentSession, pero eso es lo que store.OpenSession() devuelve, así debería ser. Alguien sabe lo que estaría causando este error? ¿No estoy configurando la variable de sesión correctamente (es la misma que la variable de tienda que funciona bien)?

Otra cosa que puede o no estar relacionada con el problema anterior es ¿cómo puedo agregar una instancia de un objeto a Autofac por solicitud en lugar de por el ciclo de vida de las aplicaciones? Mientras que el objeto RavenDB DocumentStore solo debe crearse una vez sea el ciclo de aplicación de vida, la DocumentSession se debe crear una vez por cada solicitud (tal vez crearla por nivel de aplicación está causando el error anterior).

Una última pregunta que lanzaré sobre Autofac (levemente relacionada con el código anterior) trata sobre la liberación de los objetos. Si se echa un vistazo a este tutorial:

http://codeofrob.com/archive/2010/09/29/ravendb-image-gallery-project-iii-the-application-lifecycle.aspx

La última pieza del código:

ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects(); 

y el punto de este código es para evitar fugas de las sesiones. Ahora bien, ¿es algo de lo que también debo preocuparme para Autofac y, de ser así, cómo lo haría en Autofac?

Respuesta

11

Te estoy adivinando quieren algo como:

builder.Register(c => c.Resolve<DocumentStore>().OpenSession()).InstancePerLifetimeScope(); 

"El valor por defecto de ASP.NET y WCF integraciones están configurados de manera que InstancePerLifetimeScope() adjuntará un componente para la solicitud Web actual o servicio de llamadas de método " - Autofac: InstanceScope

Básicamente, en una aplicación web, InstancePerLifetimeScope maneja el aspecto por contexto HTTP, y también elimina cualquier tipo que implemente IDisposable.

+1

@ryanzec: InstancePerLifetimeScope merece una comprensión más detallada. El autor de Autofac tiene un excelente artículo sobre el propósito detrás de un contenedor y dónde encaja en su aplicación: http://blogs.msdn.com/b/nblumhardt/archive/2008/12/27/container-managed-application- design-prelude-where-does-the-container-belong.aspx –

1

También se presentó el problema de que OpenSession devuelve una IDocumentSession en lugar de una DocumentSession.Cambiar mi clase para buscar una IDocumentSession junto con hacer lo que Jim sugirió funcionó, gracias.

Cuestiones relacionadas