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:
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)
|