Compartilhamento de tecnologia

Contêiner C# IOC, injeção de dependência e inversão de controle

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Inversão de Controle (IoC)

definição : A inversão de controle é um princípio de design que inverte o fluxo de controle na programação tradicional. Nos modelos de programação tradicionais, as dependências entre componentes são criadas e mantidas internamente pelos próprios componentes. No modo de inversão de controle, essa dependência é gerenciada por um contêiner externo (como o framework Spring, Microsoft.Extensions.DependencyInjection em .NET, etc. O componente não é mais responsável por suas próprias dependências, mas injeta todas as dependências). por meio do contêiner externo.

idéia principal: Move a criação de objetos e o gerenciamento de dependências entre eles dos próprios objetos para contêineres externos.

vantagem

  • Reduzir o acoplamento: as dependências entre os componentes não são mais codificadas, portanto, as implementações dos componentes podem ser substituídas mais facilmente, melhorando a flexibilidade e a capacidade de manutenção do sistema.
  • Melhore a modularidade: Componentes individuais podem ser desenvolvidos e testados de forma independente porque não dependem de implementações específicas, mas de interfaces abstratas ou classes abstratas.
  • Fácil de testar: como as dependências entre os componentes são externalizadas, é mais fácil usar objetos simulados ou stubs de teste para simular dependências para testes unitários.

Injeção de Dependência (DI)

definição : A injeção de dependência é uma forma específica de obter inversão de controle. Envolve passar dependências (serviços ou objetos) para classes, em vez de permitir que as próprias classes as criem.

Método para perceber

  • injeção de construtor : as dependências são fornecidas por meio do construtor da classe. Esta é a forma mais comum e recomendada de DI em C#.
  • Injeção de propriedade : Atribua dependências por meio de propriedades públicas da classe. Essa abordagem oferece flexibilidade, mas pode expor o estado interno e reduzir o encapsulamento.
  • injeção de método : passe dependências por meio de parâmetros de método. Adequado para injetar apenas dependências exigidas por um método específico.

Recipiente COI

definição :IOC container é uma estrutura para gerenciar o ciclo de vida e dependências de objetos. Ele cria automaticamente objetos com base na configuração (como arquivos XML, anotações ou configuração de código) e injeta dependências nesses objetos.

efeito

  • Criação de objeto: crie automaticamente instâncias de objetos com base na configuração.
  • Injeção de dependência: Injete dependências em objetos para obter inversão de controle.
  • Gerenciamento do ciclo de vida: Gerencie o ciclo de vida dos objetos, incluindo criação, destruição e reciclagem de recursos.

Use contêineres IOC para gerenciar dependências

Em C#, você pode usar uma variedade de contêineres IOC para gerenciar dependências, como Microsoft.Extensions.DependencyInjection (o contêiner DI integrado do .NET Core e versões posteriores), Autofac, etc. A seguir, Microsoft.Extensions.DependencyInjection é um exemplo para apresentar como usar contêineres IOC para gerenciar dependências em projetos C#.

Etapa 1: registrar-se no serviço

Os serviços são normalmente usados ​​em aplicativos .NETProgram.csouStartup.cs(para projetos ASP.NET Core) usado emIServiceCollectioninterface para registrar.

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IMyService, MyService>(); // 将MyService注册为单例服务
    // 其他服务注册
}
  • 1
  • 2
  • 3
  • 4
  • 5
Etapa 2: injetar dependências

Injete dependências no controlador, serviço ou qualquer outra classe através do construtor.

public class MyController : Controller
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }

    // ... 控制器的其他代码
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

No exemplo acima,MyControllerA classe é injetada através do construtorIMyServiceA implementação da interface (ou seja,MyService tipo).Desta forma, quandoMyControllerQuando criado, o contêiner IOC será automaticamenteIMyServiceA implementação é injetada no construtor.

Precauções
  • Use abstrações baseadas em interface: prefira interfaces ou classes abstratas para tipos dependentes para aumentar a flexibilidade e a testabilidade.
  • Evite o uso excessivo de singletons: Os serviços singleton devem ser usados ​​com cautela para evitar problemas relacionados ao estado.
  • Monitore o ciclo de vida do objeto: entenda o ciclo de vida das dependências (singleton, escopo, transitório) para gerenciar com eficácia o uso de recursos.