J'essaie d'implémenter le modèle d'options (comme recommandé ici : https://docs.asp.net/en/latest/fundamentals/configuration.html#options-config-objects) sur un projet avec NancyFX / TinyIOC mais ce n'est pas le cas travail.
J'enregistre les options sur la méthode Startup.cs/ConfigureServices mais lorsque j'essaie d'injecter les paramètres sur ma classe, TinyIoc lève Nancy.TinyIoc.TinyIoCResolutionException : Impossible de résoudre le type : AppSettings.
Je pense que c'est parce que le modèle d'options utilise Microsoft.Extensions.DependencyInjection mais Nancy utilise TinyIoc par défaut, donc TinyIoc essaie de résoudre IOptions et échoue.
Existe-t-il un moyen d'utiliser IOptions<> avec TinyIoc ?
Dans le pire des cas, puis-je remplacer TinyIoc par MS DependencyInjection ?
Voici mon code :
Startup.cs :
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}
MonService.cs :
public SearchService(IOptions<AppSettings> config)
{
}
Erreur:
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]]``
Quelques infos supplémentaires :
"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"
},
Version d'exécution DNX :
1.0.0-rc1-update1 mono
Merci beaucoup.
Vous n'enregistrez pas IOptions
J'espère que cela a du sens.
J'ai essayé de m'inscrire en faisant ceci :
Nancy.TinyIoc.TinyIoCContainer.Current.Register(typeof(IOptions<>), typeof(OptionsManager<>));
Quel BTW est ce que services.AddOptions();
fait sous le capot pour le Microsoft.Extensions.DependencyInjection
C'est ce que tu veux dire?
services.Configure() prendra la configuration chargée et s'enregistrera sur MS DI lorsque quelqu'un aura besoin d'AppSettings.
J'ai ajouté ceci sur le bootstrap personnalisé :
container.Register<IOptions<ElasticSearchConfig>, OptionsManager<ElasticSearchConfig>>();
et maintenant l'erreur ne se produit plus mais malheureusement l'objet est créé vide.
Lors du débogage, j'ai réalisé que cela renverrait le bon objet rempli :
`var appSettings = app.ApplicationServices.GetService
Mais cela renverra un objet vide :
var appSettings = Nancy.TinyIoc.TinyIoCContainer.Current.Resolve<IOptions<AppSettings>>();
Pourtant, TinyIoc remplace Mme Framework DI lorsque je demande IOptionsMicrosoft.Extensions.OptionsModel.IOptions
?
Comme je l'ai dit à l'origine, vous devez transmettre cette instance de type ou un conteneur configuré, il ne sert à rien d'enregistrer simplement le type lui-même car il doit être construit par l'usine GetService.
Hé, maintenant j'ai compris ce que tu as dit, ça a marché ! J'ai envoyé IApplicationBuilder
au bootstrap personnalisé et à partir de là, j'ai enregistré le IOptions<AppSettings>
avec la valeur renvoyée par ApplicationServices.GetService()
.
Je ne suis pas sûr que ce soit la meilleure solution, car TinyIoc agira comme une passerelle entre mon service et Microsoft.Extensions.DependencyInjection
.
@RTodorov Il peut être approprié de créer une bibliothèque d'amorçage Nancy qui utilise Microsoft.Extensions.DependencyInjection
comme conteneur à la place de TinyIoC, cela est déjà fait pour de nombreux conteneurs différents.
Commentaire le plus utile
@RTodorov Il peut être approprié de créer une bibliothèque d'amorçage Nancy qui utilise
Microsoft.Extensions.DependencyInjection
comme conteneur à la place de TinyIoC, cela est déjà fait pour de nombreux conteneurs différents.