2017-08-17 28 views
1

Die automatische Auflösung des .Net Core-Frameworks findet meine Registrierungen nicht in DryIoC.Registrierungen nicht auflösbar

Dies mit dem neuen .Net Core 2 Framework, DryIoC 2.10.7 und DryIoc.Microsoft.DependencyInjection 1.2.2. Ich kann nicht auf DryIoC 2.11.7 aktualisieren, da die DryIoc.Microsoft.DependencyInjection nicht die neueste Version abruft. Ich habe versucht, das letztere nach der Installation 2.11.7 neu zu installieren, aber das hat nicht funktioniert (mehrdeutige Referenzen).

Hier ist mein Startcode:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc() 
      .AddControllersAsServices(); 

    var container = new Container(rules => rules.With(propertiesAndFields: PropertiesAndFields.Auto)) 
        .WithDependencyInjectionAdapter(services); 
    container.ConfigureServiceProvider<CompositionRoot>(); 
} 

Und hier sind meine Registrierungscode:

public CompositionRoot(IRegistrator registrator, IContainer container) 
{ 
     //System Clock 
     registrator.Register<IClock, ConcreteClock>(Reuse.Singleton, null, null, IfAlreadyRegistered.Keep); 
     container.RegisterInstance<ISystemConfiguration>(new Configuration(container.Resolve<IClock>()), Reuse.Singleton, IfAlreadyRegistered.Keep); 

     //Logging 
     container.RegisterInstance<ILogging>(CreateLogger(container.Resolve<ISystemConfiguration>()), Reuse.Singleton, IfAlreadyRegistered.Keep); 
} 

Schließlich ist die Steuerung:

public class AdminController : Controller 
{ 
    private readonly ILogging _log; 
    private readonly IClock _clock; 
    public AdminController(ILogging log, 
          IClock clock) 
    { 
     _log = log; 
     _clock = clock; 
    } 
} 

Hier ist die Ausnahme:

System.InvalidOperationException: Der Dienst konnte für den Typ 'SharedAssets.Interfaces.ILogging' nicht aufgelöst werden, während versucht wurde, 'DataDictionaryService.Controllers.AdminController' zu aktivieren. bei Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites (Typ service, Typ implementationType ISET 1 callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(Type serviceType, Type implementationType, ISet callSiteChain 1) bei Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact (ServiceDescriptor Deskriptors, Typ service ISET 1 callSiteChain) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(Type serviceType, ISet 1 callSiteChain) bei Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateCallSite (Typ service~~POS=TRUNC, ISet Wörterbuch, TKey Schlüssel, Func`3 valueFactory, Targ arg) bei Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService (Typ serviceType) um Microsoft.Extensio ns.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService (IServiceProvider Anbieter, Typ Servicetype) bei Microsoft.AspNetCore.Mvc.Controllers.ServiceBasedControllerActivator.Create (Controller Action) bei Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider. <> c__DisplayClass5_0.g__CreateController0 (Controller Controller) bei Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (State & nächsten, Scope & Umfang, Object & Zustand, Boolean & IsCompleted) bei Microsoft.AspNetCore.Mvc.Internal .ControllerActionInvoker.d__14.MoveNext() --- Ende der Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task Task) um Microsoft.AspNetCore.Mvc.Int ernal.ResourceInvoker.d__22.MoveNext() --- Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde --- um System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() um Microsoft.AspNetCore.Mvc.Internal. ResourceInvoker.Rethrow (ResourceExecutedContext Kontext) um Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Weiter (State & nächsten, Scope & Umfang, Object & Zustand, Boolean & IsCompleted) bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17.MoveNext() --- Ende der Stack-Trace aus früheren Stelle, wo Ausnahme war geworfen --- bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__15.MoveNext() --- Ende der Stapelüberwachung von der vorherigen Position, an der die Ausnahme ausgelöst wurde --- unter System.Runtime.ExceptionServices.ExceptionDispatchInfo .Throw() bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext() --- Ende der Stack-Trace aus früheren Stelle, wo Ausnahme ausgelöst wurde --- bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.d__7.MoveNext() --- Ende des Stack-Trace vom vorherigen Speicherort, an dem die Ausnahme ausgelöst wurde --- unter System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() um System.Runtime .CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Aufgabe Aufgabe) bei Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.d__7.MoveNext()

Dank!

+0

einen Blick auf ein [Beispiel für DryIoC] Unter (https://bitbucket.org/dadhi/dryioc/src/8e609b011beafd71236f9cfe3bb2d3e0589e76ae/NetCore/src/DryIoc.AspNetCore.Sample/Startup. cs? at = Standard & Dateiviewer = Datei-Ansicht-Standard) Sie müssen den Container zurückgeben. – DavidG

+0

Danke DavidG, ich weiß nicht, wie ich das verpasst habe, weil ich das gleiche Beispiel angeschaut habe. Ich denke, diese 12-Stunden-Tage fangen an, zu mir zu kommen ... – ChrisB

Antwort

1

Wenn Sie benutzerdefinierte DI-Frameworks verwenden, müssen Sie die ConfigureServices aktualisieren, um Ihre benutzerdefinierte IServiceProvider zurückzugeben.

Zur Laufzeit wird Ihr Provider verwendet, um Typen aufzulösen und Abhängigkeiten zu injizieren.

Referenz: Introduction to Dependency Injection in ASP.NET Core: Replacing the default services container

+0

Danke, Nkosi. Nachdem ich jedoch meinen Code geändert habe, um Ihrem Beispiel zu folgen, bekomme ich jetzt eine ziemlich stumpfe StackOverflowException (die Ironie/Zufall, es ist echt ...). Eine nicht behandelte Ausnahme vom Typ 'System.StackOverflowException' ist in System.Private.CoreLib.dll aufgetreten. Aus dem Speicherdiagramm in VS2017 sieht es so aus, als ob DryIoC einen Überlauf verursacht. – ChrisB

+0

@ChrisB. Das sieht nach Anzeichen einer zirkulären Abhängigkeit aus. Versuchen Sie, einen Komponententest zu erstellen. Richten Sie den Container ein und versuchen Sie, einen Ihrer Dienste aufzulösen. Sehen Sie, wenn Sie das gleiche Problem bekommen. Wenn ja, dann müssen Sie Ihre Klassen überprüfen und sehen, wo Sie die zirkuläre Abhängigkeit haben. – Nkosi

+0

Es funktioniert. Die dem Container hinzugefügte Regel verursacht den Fehler. Noch seltsamer, ich habe den Container selbst validieren lassen, nachdem ich alle Registrierungen gemacht habe, und er wirft die StackOverflowException nicht zur Bestätigung: "container.VerifyResolutions();" – ChrisB

Verwandte Themen