Entendendo a enumeração Set Flag em C#: Atribuindo Flags
O gerenciamento de configuração é um aspecto essencial na construção de aplicações escaláveis e de fácil manutenção em C#. Uma das maneiras mais eficazes de lidar com configurações é usando o padrão Options . Em seu vídeo " O padrão Options em C# em 10 minutos ou menos" , Tim Corey oferece uma explicação concisa, porém esclarecedora, desse padrão e de como implementá-lo de forma eficiente. Neste artigo, exploraremos o padrão Options por meio das explicações e demonstrações de Tim em seu vídeo.
Introdução
Tim começa apresentando o padrão Options como uma maneira poderosa e simples de recuperar informações de arquivos de configuração e injetá-las na injeção de dependência (DI). Ele destaca diversas vantagens desse padrão, tais como:
- A capacidade de gerenciar alterações de valores em tempo de execução.
- Suporte integrado para validação de dados.
- Compatibilidade com vários tipos de projetos C#, incluindo aplicativos Blazor .
Tim enfatiza que, embora normalmente ofereça treinamento técnico aprofundado, este vídeo foi desenvolvido como um guia rápido para implementar o padrão Options.
Configurando o projeto
Tim começa abrindo o Visual Studio com um aplicativo Web Blazor (somente renderização do lado do servidor). Ele já fez algumas modificações para acelerar a demonstração. A configuração principal envolve:
- Criando um arquivo
appsettings.jsoncom uma seção CloudInfo contendo três pares de chave-valor. - Usando um modelo Plain Old CLR Object (POCO) chamado
CloudInfoOptions, que mapeia para esses valores de configuração.
O arquivo de configuração
O arquivo appsettings.json contém a seguinte seção:
{
"CloudInfo": {
"Storage": "Azure Storage",
"Website": "Azure Static Web Apps",
"API": "Azure Web App"
}
}
Tim esclarece que, embora esteja usando appsettings.json, os valores de configuração também poderiam vir de:
appsettings.Development.jsonsecrets.json- Variáveis de ambiente
Vinculação da configuração às opções
Agora, Tim explica como vincular os valores de configuração à classe CloudInfoOptions e injetá-los em DI.
Registrando opções em Program.cs
Em Program.cs, Tim adiciona a seguinte linha dentro builder.Services:
builder.Services.Configure<CloudInfoOptions>(builder.Configuration.GetSection("CloudInfo"));
builder.Services.Configure<CloudInfoOptions>(builder.Configuration.GetSection("CloudInfo"));
Isso vincula a seção CloudInfo de appsettings.json à classe CloudInfoOptions. Tim observa que esta etapa garante que os valores estejam disponíveis na injeção de dependência.
Opções de injeção em um componente de Razor
Tim avança para o componente da Home Page (Index.razor) e modifica-o para exibir valores de configuração dinamicamente.
Ele injeta a interface IOptions no componente:
@inject IOptions<CloudInfoOptions> CloudInfoOptions
Para recuperar os valores reais, ele os atribui dentro de OnInitialized:
protected override void OnInitialized()
{
CloudInfo = CloudInfoOptions.Value;
}
protected override void OnInitialized()
{
CloudInfo = CloudInfoOptions.Value;
}
Tim explica que IOptions<t> fornece uma instância Singleton dos valores de configuração, significando que permanece constante ao longo do ciclo de vida do aplicativo. Quando o aplicativo é executado, os valores de configuração aparecem corretamente na página.
Explorando diferentes opções de interfaces
Tim então apresenta três maneiras diferentes de usar o padrão Options:
1. Opções Singleton
Por padrão, IOptions<t> fornece uma instância Singleton. Tim demonstra que, se o arquivo de configuração for atualizado enquanto o aplicativo estiver em execução, as alterações não serão refletidas a menos que o aplicativo seja reiniciado.
2. Opções Com Escopo - Usando IOptionsSnapshot<t>
Para habilitar atualizações por solicitação , Tim modifica a injeção para:
@inject IOptionsSnapshot<CloudInfoOptions> CloudInfoOptions
Isso garante que cada nova solicitação HTTP receba valores de configuração atualizados. Tim testa isso modificando appsettings.json, atualizando a página e mostrando que os valores atualizados agora aparecem imediatamente.
Ele explica que IOptionsSnapshot<t> é útil para cenários em que mudanças precisam ser refletidas sem reiniciar o aplicativo, mas não requerem monitoramento ao vivo.
3. Monitoramento de Mudanças - Usando IOptionsMonitor<t>
Finalmente, Tim apresenta IOptionsMonitor<t>, que possibilita detecção de mudança em tempo real. Ele atualiza a injeção para:
@inject IOptionsMonitor<CloudInfoOptions> CloudInfoOptions
Ao contrário de IOptionsSnapshot, que atualiza por solicitação, IOptionsMonitor<t> pode disparar eventos quando os valores de configuração mudam. Isso é particularmente útil quando você precisa reagir dinamicamente a mudanças de configuração.
Tim observa que IOptionsMonitor<t> é suportado por um singleton, mas pode atualizar valores dinamicamente quando o arquivo de configuração subjacente é alterado.
Conclusão
Tim conclui o vídeo resumindo as principais diferenças entre as três abordagens:
| Interface | Vida | Atualizações sobre mudanças |
|---|---|---|
IOptions<t> |
Singleton | Não |
IOptionsSnapshot<t> |
Escopo | A pedido |
IOptionsMonitor<t> |
Singleton | Sim |
Ele enfatiza que, embora o padrão Options simplifique o gerenciamento de configuração, entender essas diferentes variações ajuda a escolher a abordagem correta com base nos requisitos do projeto.
Seguindo a abordagem de Tim, os desenvolvedores podem gerenciar com eficiência as configurações do aplicativo , garantir uma injeção de dependência tranquila e lidar com as alterações de configuração em tempo de execução de forma eficaz. Para melhor compreensão, assista ao vídeo completo e visite o canal dele para mais vídeos esclarecedores sobre C#.
