Autofac — це чудова штука. NET IoC контейнери. Він керує залежностями між класами, щоб додаток все ще можна було легко змінювати у міру зростання масштабу та складності. Він реалізується шляхом трактування звичайних .NET-класів як компонентів. Я також кліше щодо контейнерів Autofac і написав багато статей:
Створіть новий проєкт 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 ядра:
Вхід за гіперпосиланням видно.
(Кінець)
|