Nancy: IOptions-Muster kann nicht mit Nancy/TinyIoc verwendet werden

Erstellt am 25. Jan. 2016  ·  6Kommentare  ·  Quelle: NancyFx/Nancy

Ich versuche, das Optionsmuster (wie hier empfohlen: https://docs.asp.net/en/latest/fundamentals/configuration.html#options-config-objects) in einem Projekt mit NancyFX / TinyIOC zu implementieren, aber das ist nicht der Fall Arbeiten.

Ich registriere die Optionen für die Methode Startup.cs/ConfigureServices, aber wenn ich versuche, die Einstellungen in meine Klasse einzufügen, löst TinyIoc Nancy.TinyIoc.TinyIoCResolutionException aus: Typ kann nicht aufgelöst werden: AppSettings.

Ich denke, das liegt daran, dass das Optionsmuster Microsoft.Extensions.DependencyInjection verwendet, aber Nancy TinyIoc als Standard verwendet, sodass TinyIoc versucht, IOptions aufzulösen und fehlschlägt.

Gibt es eine Möglichkeit, IOptions<> mit TinyIoc zu verwenden?

Kann ich im schlimmsten Fall TinyIoc durch MS DependencyInjection ersetzen?

Hier ist mein Code:

Startup.cs:

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

MyService.cs:

public SearchService(IOptions<AppSettings> config)
{
}

Fehler:

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]]``

Einige zusätzliche Informationen:

"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"
},

DNX-Laufzeitversion:

1.0.0-rc1-update1 mono

Vielen Dank.

Hilfreichster Kommentar

@RTodorov Es kann angebracht sein, eine Nancy-Bootstrapper-Bibliothek zu erstellen, die Microsoft.Extensions.DependencyInjection als Container anstelle von TinyIoC verwendet, dies wird bereits für viele verschiedene Container getan.

Alle 6 Kommentare

Sie registrieren IOptions nichtin Nancys Container irgendwohin, damit es nicht funktioniert, ich bin mir nicht sicher, was diese Magie "services.Configure ." ist(Configuration.GetSection("AppSettings"));" funktioniert unter der Haube, aber Sie müssen diesen Typ in Nancys Container registrieren lassen, indem Sie entweder:

  • Erstellen Sie Ihren eigenen Bootstrapper und übergeben Sie IOptionsin seinen ctor, indem Sie diesen Bootstrapper verwenden, in dem Sie die Verwendung von Nancy konfigurieren, und dann im Bootstrapper registrieren, dass in ConfigureApplicationContainer
  • Wenn Sie weitere Typen freigeben möchten, gehen Sie wie oben beschrieben vor, übergeben Sie jedoch anstelle der Typen einen neu konfigurierten TinyIocContainer und geben Sie dann diese Instanz für GetApplicationContainer in Ihrem abgeleiteten Bootstrapper zurück.

Hoffe das macht Sinn.

Ich habe versucht, mich so zu registrieren:

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

Welches BTW macht services.AddOptions(); unter der Haube für die Microsoft.Extensions.DependencyInjection

Ist es das was du meinst?

services.Configure() nimmt die geladene Konfiguration und registriert sich auf MS DI, wenn jemand AppSettings benötigt.

Ich habe dies im benutzerdefinierten Bootstrap hinzugefügt:

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

und jetzt tritt der Fehler nicht mehr auf, aber leider wird das Objekt leer erstellt.

Beim Debuggen habe ich festgestellt, dass dies das richtige gefüllte Objekt zurückgibt:

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

Dies wird jedoch ein leeres Objekt zurückgeben:

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

TinyIoc ersetzt jedoch Ms Framework DI, wenn ich IOptions anfordere. Ich habe auch festgestellt, dass alle Microsoft.*-DLLs auf der Ignore-Liste von TinyIoc stehen. Bedeutet dies, dass es nicht "antworten" sollte, wenn ich nach einem Microsoft.Extensions.OptionsModel.IOptions frage?

Wie ich ursprünglich sagte, müssen Sie diese Typinstanz oder einen konfigurierten Container übergeben. Es ist nicht gut, nur den Typ selbst zu registrieren, da er von der GetService-Factory erstellt werden muss.

Hey, jetzt verstehe ich, was du gesagt hast, es hat funktioniert! Ich habe IApplicationBuilder an den benutzerdefinierten Bootstrap gesendet und von dort aus IOptions<AppSettings> mit dem von ApplicationServices.GetService() Wert registriert.

Ich bin mir jedoch nicht sicher, ob dies die beste Lösung ist, da TinyIoc als Gateway zwischen meinem Dienst und Microsoft.Extensions.DependencyInjection fungieren wird.

@RTodorov Es kann angebracht sein, eine Nancy-Bootstrapper-Bibliothek zu erstellen, die Microsoft.Extensions.DependencyInjection als Container anstelle von TinyIoC verwendet, dies wird bereits für viele verschiedene Container getan.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

thecodejunkie picture thecodejunkie  ·  8Kommentare

Radzhab picture Radzhab  ·  11Kommentare

destagia picture destagia  ·  5Kommentare

bsommardahl picture bsommardahl  ·  3Kommentare

thecodejunkie picture thecodejunkie  ·  4Kommentare