Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 20665|Resposta: 0

[.NET Core] ASP.NET Core injeta NullReferenceException com o atributo Autofac

[Copiar link]
Postado em 2020-9-12 20:57:21 | | | |
Autofac é incrível. Contêineres NET IoC. Ele gerencia as dependências entre classes, para que a aplicação ainda possa ser facilmente modificada à medida que a escala e a complexidade aumentam. Ele é implementado tratando classes .NET regulares como componentes.
Também sou um clichê em relação a contêineres Autofac, e já escrevi muitos artigos:

Use o autofac no MVC para implementar o registro automático
https://www.itsvse.com/thread-8993-1-1.html

Erro "Dependência circular de componente detectada" do Autofac resolvido
https://www.itsvse.com/thread-8970-1-1.html

ASP.NET Core usa Autofac para implementar a injeção de IOC
https://www.itsvse.com/thread-7563-1-1.html

O escopo da instância do componente autofac
https://www.itsvse.com/thread-5080-1-1.html

Atributo Autofac do controlador mvc injetado no controlador
https://www.itsvse.com/thread-3621-1-1.html

ASP.NET Injeção de Dependência Core usa o contêiner IOC que vem com ele
https://www.itsvse.com/thread-7562-1-1.html

ASP.NET Core usa Autofac para implementar a injeção de IOC
https://www.itsvse.com/thread-7563-1-1.html

ASP.NET Core usa o Autofac para implementar interceptação AOP
https://www.itsvse.com/thread-7566-1-1.html


Crie um novo projeto ASP.NET Core 3.1 e faça referência a pacotes relacionados ao autofac-ul via nuget, da seguinte forma:


Vamos criar uma nova interface e implementação do ITest, o código é o seguinte:




Crie um novo controlador de classe base BaseControler, e outros controladores herdem a classe abstrata, adicione a propriedade ITest à classe base, e o código é o seguinte:

Deixe o WeatherForecastController herdar da classe abstrata BaseControler, adicionando o seguinte método de teste:

O método ConfigureContainer na classe Startup registra a interface e define a entrada do atributo do controlador, cujo código é o seguinte:

Tente visitar:O login do hiperlink está visível.

A exceção NullReferenceException é citada na mensagem em branco, como mostrado na figura a seguir:



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


PasseO construtor é injetado na interface ITest, seu método é chamado, o teste passa e pode ser chamado normalmente

Causas das anomalias

A implementação do Controlador é mais especial, o Controlador não resolve e ativa por padrão através de seu próprio container, é gerenciado pelo próprio MVC, mas a Microsoft fornece este método:

Você pode fazer o Controlador usar seu próprio container chamando o método AddControllersAsServices(), cujo código-fonte principal é o seguinte:



O método ConfigureServices no objeto Inicialização padrão é configurado da seguinte forma:

Modificamos para:

Ou:

O código-fonte ServiceBasedControllerActivator é o seguinte:

Uma vez configurado, carregue o controlador diretamente do contêiner DI, o controlador analisará o serviço do Autofac, e a injeção de propriedades que configuramos entrará em vigor. Como mostrado abaixo:



Por fim, o endereço do código-fonte de asp.net núcleo está anexado:

O login do hiperlink está visível.

(Fim)





Anterior:O Hangfire adiciona dados normalmente, mas continua executando por causa da exceção
Próximo:Como exibir dados do Sqlite em tabelas avançadas com E4A?
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com