Nancy: No puedo usar el patrón IOptions con Nancy / TinyIoc

Creado en 25 ene. 2016  ·  6Comentarios  ·  Fuente: NancyFx/Nancy

Estoy tratando de implementar el patrón de opciones (como se recomienda aquí: https://docs.asp.net/en/latest/fundamentals/configuration.html#options-config-objects) en un proyecto con NancyFX / TinyIOC pero no es laboral.

Estoy registrando las Opciones en el método Startup.cs / ConfigureServices pero cuando intento inyectar la configuración en mi clase, TinyIoc arroja Nancy.TinyIoc.TinyIoCResolutionException: No se puede resolver el tipo: AppSettings.

Creo que esto se debe a que el patrón de opciones usa Microsoft.Extensions.DependencyInjection, pero Nancy usa TinyIoc como predeterminado, por lo que TinyIoc intenta resolver IOptions y falla.

¿Hay alguna forma de usar IOptions <> con TinyIoc?

En el peor de los casos, ¿puedo reemplazar TinyIoc por MS DependencyInjection?

Aquí está mi código:

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddOptions();
    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}

MyService.cs:

public SearchService(IOptions<AppSettings> config)
{
}

Error:

Application startup exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: Something went wrong when trying to satisfy one of the dependencies during composition, make sure that you've registered all new dependencies in the container and inspect the innerexception for more details. ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.NancyEngine ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.Routing.DefaultRequestDispatcher ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.Routing.DefaultRouteResolver ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Nancy.Routing.RouteCache ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: MyProject.MyService ---> Nancy.TinyIoc.TinyIoCResolutionException: Unable to resolve type: Microsoft.Extensions.OptionsModel.IOptions 1 [[MyProject.AppSettings, MyProject, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null]] ''

Alguna información extra:

"dependencies": {
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.Owin": "1.0.0-rc1-final",
    "Nancy": "1.4.3",
    "Microsoft.Framework.ConfigurationModel": "1.0.0-beta4",
    "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-beta4",
    "Microsoft.Extensions.OptionsModel": "1.0.0-rc1-final"
},

Versión en tiempo de ejecución DNX:

1.0.0-rc1-update1 mono

Muchísimas gracias.

Comentario más útil

@RTodorov Puede ser apropiado crear una biblioteca bootstrapper de Nancy que use Microsoft.Extensions.DependencyInjection como contenedor en lugar de TinyIoC, esto ya se hace para muchos contenedores diferentes.

Todos 6 comentarios

No estás registrando IOptionsen el contenedor de Nancy en cualquier lugar, por lo que no va a funcionar, no estoy seguro de qué servicios "mágicos".(Configuration.GetSection ("AppSettings")); "está funcionando bajo el capó, pero necesitará registrar ese tipo en el contenedor de Nancy mediante:

  • Creando su propio bootstrapper, pasando IOptionsen su ctor, usando ese bootstrapper donde está configurando el uso de Nancy, luego en el bootstrapper registre eso en ConfigureApplicationContainer
  • Si hay más tipos que desea compartir, haga lo mismo que el anterior, pero en lugar de pasar los tipos, pase un TinyIocContainer recién configurado y luego devuelva esa instancia para GetApplicationContainer en su bootstrapper derivado.

Espero que tenga sentido.

Intenté registrarme haciendo esto:

Nancy.TinyIoc.TinyIoCContainer.Current.Register(typeof(IOptions<>), typeof(OptionsManager<>));

¿Qué BTW es lo que services.AddOptions(); hace bajo el capó por el Microsoft.Extensions.DependencyInjection

¿Es esto lo que quieres decir?

services.Configure () tomará la configuración cargada y se registrará en MS DI para cuando alguien requiera AppSettings.

Agregué esto en el bootstrap personalizado:

container.Register<IOptions<ElasticSearchConfig>, OptionsManager<ElasticSearchConfig>>();

y ahora el error ya no ocurre, pero desafortunadamente el objeto se crea vacío.

Al depurar, me di cuenta de que esto devolverá el objeto poblado correcto:

`var appSettings = app.ApplicationServices.GetService> (); ``

Pero esto devolverá un objeto vacío:

var appSettings = Nancy.TinyIoc.TinyIoCContainer.Current.Resolve<IOptions<AppSettings>>();

Aún así, TinyIoc está reemplazando a la Sra. Framework DI cuando solicito IOptions. También me di cuenta de que todas las DLL de Microsoft. * Están en la lista de Ignorar de TinyIoc, ¿significa que no debería "responder" cuando pido un Microsoft.Extensions.OptionsModel.IOptions ?

Como dije originalmente, debe pasar esa instancia de tipo, o un contenedor configurado, no es bueno simplemente registrar el tipo en sí, ya que debe ser construido por la fábrica GetService.

Oye, ahora entiendo lo que dijiste, ¡funcionó! Envié IApplicationBuilder al bootstrap personalizado y desde allí registré el IOptions<AppSettings> con el valor devuelto de ApplicationServices.GetService() .

Sin embargo, no estoy seguro de que esta sea la mejor solución, ya que TinyIoc actuará como puerta de enlace entre mi servicio y Microsoft.Extensions.DependencyInjection .

@RTodorov Puede ser apropiado crear una biblioteca bootstrapper de Nancy que use Microsoft.Extensions.DependencyInjection como contenedor en lugar de TinyIoC, esto ya se hace para muchos contenedores diferentes.

¿Fue útil esta página
0 / 5 - 0 calificaciones