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.
Sie registrieren IOptions nicht
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 anfordereMicrosoft.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.
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.