Nancy: Impossible d'utiliser le modèle IOptions avec Nancy/TinyIoc

Créé le 25 janv. 2016  ·  6Commentaires  ·  Source: NancyFx/Nancy

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.

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.

Tous les 6 commentaires

Vous n'enregistrez pas IOptionsdans le conteneur de Nancy n'importe où, donc ça ne va pas fonctionner, je ne sais pas ce que ces "services magiques.Configure(Configuration.GetSection("AppSettings"));" se fait sous le capot, mais vous devrez enregistrer ce type dans le conteneur de Nancy soit :

  • Créer votre propre bootstrapper, passer IOptionsdans son ctor, en utilisant ce programme d'amorçage où vous configurez l'utilisation de Nancy, puis dans le programme d'amorçage, enregistrez-le dans ConfigureApplicationContainer
  • S'il y a plus de types que vous souhaitez partager, faites la même chose que ci-dessus, mais au lieu de transmettre les types, transmettez un TinyIocContainer nouvellement configuré, puis renvoyez cette instance pour GetApplicationContainer dans votre programme d'amorçage dérivé.

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 IOptions. J'ai également réalisé que toutes les dll Microsoft.* sont sur la liste Ignorer de TinyIoc, cela signifie-t-il qu'il ne devrait pas "répondre" lorsque je demande un Microsoft.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.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

juniormayhe picture juniormayhe  ·  4Commentaires

Hell0wor1d picture Hell0wor1d  ·  12Commentaires

jgillich picture jgillich  ·  7Commentaires

thecodejunkie picture thecodejunkie  ·  8Commentaires

Radzhab picture Radzhab  ·  11Commentaires