Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 20665|Antwoord: 0

[.NET Core] ASP.NET Core injecteert NullReferenceException met het Autofac-attribuut

[Link kopiëren]
Geplaatst op 2020-9-12 20:57:21 | | | |
Autofac is geweldig. NET IoC-containers. Het beheert de afhankelijkheden tussen klassen, zodat de applicatie nog steeds eenvoudig kan worden aangepast naarmate de schaal en complexiteit toenemen. Het wordt geïmplementeerd door reguliere .NET-klassen als componenten te behandelen.
Ik ben ook een cliché over Autofac-containers, en ik heb veel artikelen geschreven:

Gebruik autofac in MVC om automatische registratie te implementeren
https://www.itsvse.com/thread-8993-1-1.html

Autofac "Circulaire componentafhankelijkheid gedetecteerd" fout opgelost
https://www.itsvse.com/thread-8970-1-1.html

ASP.NET Core gebruikt Autofac om IOC-injectie te implementeren
https://www.itsvse.com/thread-7563-1-1.html

De instantiescope van de autofac-component
https://www.itsvse.com/thread-5080-1-1.html

mvc Controller Autofac-attribuut geïnjecteerd in de controller
https://www.itsvse.com/thread-3621-1-1.html

ASP.NET Core dependency injection gebruikt de IOC-container die erbij hoort
https://www.itsvse.com/thread-7562-1-1.html

ASP.NET Core gebruikt Autofac om IOC-injectie te implementeren
https://www.itsvse.com/thread-7563-1-1.html

ASP.NET Core gebruikt Autofac om AOP-onderschepping te implementeren
https://www.itsvse.com/thread-7566-1-1.html


Maak een nieuw project aan ASP.NET Core 3.1 en verwijs naar autofac-gerelateerde pakketten via nuget, als volgt:


Laten we een nieuwe ITest-interface en implementatie maken, de code is als volgt:




Maak een nieuwe BaseController-basisclasscontroller aan, andere controllers erven de abstracte klasse, voegen de ITest-eigenschap toe aan de basisklasse, en de code is als volgt:

Laat de WeatherForecastController erven van de abstracte klasse BaseController, met de volgende testmethode:

De ConfigureContainer-methode in de Startup-klasse registreert de interface en stelt de invoer van het controllerattribuut in; de code is als volgt:

Probeer te bezoeken:De hyperlink-login is zichtbaar.

De uitzondering NullReferenceException wordt geciteerd in het blanco bericht, zoals weergegeven in de volgende figuur:



NullReferenceException: Object reference not set to an instance of an object.


PasDe constructor wordt geïnjecteerd in de ITest-interface, zijn methode wordt aangeroepen, de test slaagt en kan normaal worden aangeroepen

Oorzaken van anomalieën

De implementatie van de Controller is specialer, de Controller resolve&Activate standaard niet via een eigen container, hij wordt beheerd door MVC zelf, maar Microsoft biedt deze methode aan:

Je kunt de Controller zijn eigen container laten gebruiken door de AddControllersAsServices()-methode aan te roepen, waarvan de hoofdbroncode als volgt is:



De ConfigureServices-methode in het standaard Startup-object is als volgt geconfigureerd:

We passen het aan naar:

Of:

De broncode van ServiceBasedControllerActivator is als volgt:

Eenmaal geconfigureerd, laad je de controller direct vanuit de DI-container, de controller zal de service van Autofac parsen en de property injection die we hebben geconfigureerd wordt uitgevoerd. Zoals hieronder getoond:



Ten slotte wordt het broncodeadres van asp.net kern toegevoegd:

De hyperlink-login is zichtbaar.

(Einde)





Vorig:Hangfire voegt normaal data toe, maar blijft uitvoeren vanwege de uitzondering
Volgend:Hoe kun je Sqlite-gegevens weergeven in geavanceerde tabellen met E4A?
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com