Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 20665|Відповідь: 0

[.NET Core] ASP.NET Core впроваджує NullReferenceException з атрибутом Autofac

[Копіювати посилання]
Опубліковано 2020-9-12 20:57:21 | | | |
Autofac — це чудова штука. NET IoC контейнери. Він керує залежностями між класами, щоб додаток все ще можна було легко змінювати у міру зростання масштабу та складності. Він реалізується шляхом трактування звичайних .NET-класів як компонентів.
Я також кліше щодо контейнерів Autofac і написав багато статей:

Використовуйте autofac у MVC для реалізації автоматичної реєстрації
https://www.itsvse.com/thread-8993-1-1.html

Autofac «Виявлено циклічну залежність компонентів» помилку вирішено
https://www.itsvse.com/thread-8970-1-1.html

ASP.NET Core використовує Autofac для реалізації ін'єкції IOC
https://www.itsvse.com/thread-7563-1-1.html

Сфера застосування екземплярів компонента autofac
https://www.itsvse.com/thread-5080-1-1.html

атрибут mvc Controller Autofac, введений у контролер
https://www.itsvse.com/thread-3621-1-1.html

ASP.NET Ін'єкція залежностей ядра використовує контейнер IOC, що йде в комплекті
https://www.itsvse.com/thread-7562-1-1.html

ASP.NET Core використовує Autofac для реалізації ін'єкції IOC
https://www.itsvse.com/thread-7563-1-1.html

ASP.NET Core використовує Autofac для реалізації перехоплення AOP
https://www.itsvse.com/thread-7566-1-1.html


Створіть новий проєкт ASP.NET Core 3.1 і посилайтеся на пакети, пов'язані з autofac, через nuget, наступним чином:


Давайте створимо новий інтерфейс ITest та реалізацію, код виглядає так:




Створіть новий контролер базового класу BaseController, і інші контролери успадкують абстрактний клас, додайте властивість ITest до базового класу, і код виглядає так:

Нехай WeatherForecastController успадкує від абстрактного класу BaseController, додаючи наступний метод тестування:

Метод ConfigureContainer у класі Startup реєструє інтерфейс і встановлює вхідний атрибут контролера, код виглядає так:

Спробуйте відвідати:Вхід за гіперпосиланням видно.

Виняток NullReferenceException цитується у порожньому повідомленні, як показано на наступному рисунку:



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


ПрохідКонструктор вводиться в інтерфейс ITest, його метод викликається, тест проходить, і його можна викликати нормально

Причини аномалій

Реалізація контролера є більш особливою: Контролер за замовчуванням не розв'язує та активує через власний контейнер, ним керує сам MVC, але Microsoft надає такий метод:

Ви можете змусити контролер використовувати власний контейнер, викликавши метод AddControllersAsServices(), основний вихідний код якого виглядає так:



Метод ConfigureServices у стандартному об'єкті Startup налаштований наступним чином:

Ми модифікуємо його на:

Або:

Вихідний код ServiceBasedControllerActivator виглядає так:

Після налаштування завантажте контролер безпосередньо з DI-контейнера, контролер розшифрує сервіс з Autofac, і налаштована ми ін'єкція властивостей почне діяти. Як показано нижче:



Нарешті, додається адреса вихідного коду asp.net ядра:

Вхід за гіперпосиланням видно.

(Кінець)





Попередній:Hangfire додає дані звичайним чином, але продовжує виконувати їх через виняток
Наступний:Як відображати дані Sqlite у розширених таблицях за допомогою E4A?
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com