2012-03-05 2 views
8

Tengo otra pregunta nueva con respecto al registro de dependencias adicionales dentro de TinyIoc para su uso dentro de NancyFX.Registro de dependencias dentro de TinyIOC para su uso en NancyFX

sigo para obtener las siguientes excepciones cuando se ejecuta la aplicación ...

Unable to resolve type: AdvancedSearchService.Interfaces.IResponseFactory 

Exception Details: TinyIoC.TinyIoCResolutionException: Unable to resolve type: AdvancedSearchService.Interfaces.IResponseFactory 

Source Error: 
Line 25:    var container = TinyIoCContainer.Current; 
Line 26: 
Line 27:    _responseFactory = container.Resolve<IResponseFactory>(); 
Line 28:   
Line 29: 

Actualmente estoy Registro de Mi dependencias de forma incorrecta, pero me parece que no puede averiguar la forma correcta. Debajo está mi código dentro de mi bootstrapper personalizado. También tenga en cuenta que actualmente no estoy llamando al método base.ConfigureRequestContainer porque parece que no puedo encontrar la forma de obtener el contexto actual.

protected override void ConfigureApplicationContainer(TinyIoCContainer container) 
{ 
    container.Register<IRavenSessionManager>(new RavenSessionManager()); 
    base.ConfigureApplicationContainer(container); 

    ConfigureRequestContainer(container); 
} 


protected void ConfigureRequestContainer(TinyIoCContainer applicationContainer) 
{ 
    var requestContainer = applicationContainer.GetChildContainer(); 
    requestContainer.Register<ISearchRepository>(new SearchRepository(requestContainer.Resolve<IRavenSessionManager>().GetSession())); 
    requestContainer.Register<IResponseFactory>(new ResponseFactory(requestContainer.Resolve<ISearchRepository>())); 
    //base.ConfigureRequestContainer(requestContainer,[I NEED THE CONTEXT]) 
} 

Cualquier ayuda sería apreciada realmente ... al parecer mi ignorancia no tiene límites :)

+0

Gracias Steven para la limpieza que up..I ni se dio cuenta de que el código fue separada cuando lo publicado. – TheWeekendDeveloper

Respuesta

36

mal, no es 100% seguro de por dónde empezar .. que no es necesario el contexto porque eres hacerlo mal :-)

En primer lugar, ¿por qué llamas "configurar contenedor de solicitudes" y por qué estás creando un contenedor hijo? Usted no hace eso :-) Hay dos ámbitos, ámbito de aplicación, configurado anulando ConfigureApplicationContainer, y ámbito de solicitud, configurado anulando ConfigureRequestContainer, no los llama por su cuenta, simplemente los anula dependiendo de cómo desee que alcance tus objetos

En segundo lugar, el bootstrapper predeterminado de Nancy "autoregisterá" todo lo que pueda en su implementación predeterminada de ConfigureApplicationContainer. Al llamar a "base" después de ha realizado un registro manual, está efectivamente copiando sobre su registro original mediante registro automático. O no llame a base, o llámelo antes de hacer sus registros manuales. Y, nuevamente, no llame a ConfigureRequestContainer desde ConfigureApplicationContainer :-)

Si no le importa que todo sea un ámbito de aplicación (para que singetons obtenga la misma instancia para cada solicitud), entonces no necesita nada de esto , solo puedes confiar en autoregister.

Actualmente está construyendo sus objetos manualmente y colocándolos en el contenedor, parece una forma bastante extraña de hacerlo. Normalmente solo registrarías los tipos y dejarías que el contenedor manejara las instancias cuando lo necesitara.

No reemplaza a ConfigureRequestContainer, solo está creando un método nuevo (con una firma diferente).

Por lo tanto, lo que es probable que desee es algo así como:

protected override void ConfigureApplicationContainer(TinyIoCContainer container) 
{ 
    base.ConfigureApplicationContainer(container); 

    // Autoregister will actually do this for us, so we don't need this line, 
    // but I'll keep it here to demonstrate. By Default anything registered 
    // against an interface will be a singleton instance. 
    container.Register<IRavenSessionManager, RavenSessionManager>(); 
} 

// Need to override this, not just make a new method 
protected override void ConfigureRequestContainer(TinyIoCContainer container, NancyContext context) 
{ 
    // Get our session manager - this will "bubble up" to the parent container 
    // and get our application scope singleton 
    var session = container.Resolve<IRavenSessionManager>().GetSession(); 

    // We can put this in context.items and it will be disposed when the request ends 
    // assuming it implements IDisposable. 
    context.Items["RavenSession"] = session; 

    // Just guessing what this type is called 
    container.Register<IRavenSession>(session); 

    container.Register<ISearchRepository, SearchRepository>(); 
    container.Register<IResponseFactory, ResponseFactory>(); 
} 
+4

Nancy también realiza la resolución automática de las dependencias de los constructores en los módulos (y otros tipos) por lo que _nunca_ debería usar _TinyIoCContainer.Current_ y resolver directamente desde allí. Simplemente agrega una dependencia a tu constructor y listo. Gracias – TheCodeJunkie

+0

Debo decir esto ... para alguien que tenga el avatar de GrumpyDev, esperaba mucho más :(y no tantos :). Sé que mi código tuvo que confundirte, así que gracias por tu paciencia. – TheWeekendDeveloper

+0

Por cierto: eso lo arregló como un amuleto. Reconoció lo que no pude reconocer, y esa fue la firma diferente del método ConfigureRequestContainer. Primero traté de anularlo como lo hizo en su solución, pero no me di cuenta de que estaba usando la firma anterior. Debido a que Nancy no reconoció la firma anterior, creé mi método privado por desesperación :).Curiosamente, finalmente agregué el base.ConfigureRequestManager (contianer, context) a mi método privado, pero no pude establecer la conexión. Mi cerebro estaba frito por ese punto :). – TheWeekendDeveloper

Cuestiones relacionadas