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.
No estás registrando IOptions
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 IOptionsMicrosoft.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.
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.