ASP .NET Core -  Usando o padrão Options simplificado


Neste artigo veremos usar o padrão Options em aplicações ASP .NET Core usando uma abordagem simplificada.

Podemos definir a configuração em nossos projetos ASP .NET Core usando o padrão Options conforme descrito na documentação oficial: Options Pattern

Neste artigo vamos usar uma abordagem simplificada na utilização deste padrão onde vamos supor que as opções nunca serão alteradas.

Assim vamos supor que vamos definir a configuração de um servidor Smtp onde vamos definir o domínio e a porta.

De acordo com a documentação oficial a sugestão de uso do padrão Option para realizar essa tarefa seria fazer o seguinte:

1- Definir no arquivo appsettings.json os valores e as chaves:

{
  "SmtpConfiguration": {
    "Domain": "smtp.gmail.com",
    "Port": 465
  }
}

A seguir na classe SmtpConfiguration vamos definir as propriedades Domain e Port:

    public class SmtpConfiguration
    {
        public string Domain { get; set; }
        public int Port { get; set; }
    }

E no método ConfigureServices da classe Startup vamos registrar o serviço:

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<SmtpConfiguration>(Configuration.GetSection("SmtpConfiguration"));
            services.AddControllersWithViews();
        }

Para obter o valor podemos definir o controller HomeController o código a seguir:

   public class HomeController : Controller
  {
        private readonly SmtpConfiguration _smtpConfiguration;

        public HomeController(IOptions<SmtpConfiguration> smtpConfiguration)
        {
            _smtpConfiguration = smtpConfiguration.Value;
        }
        public IActionResult Index()
        {
            return View();
        }
    }

Esta seria a abordagem tradicional.

Usando uma abordagem simplificada

Vamos agora usar uma abordagem onde não vamos mais usar IOptions em controladores, serviços e repositórios.

Em vez disso, vamos extrair o objeto SmtpConfiguration de IOptions<SmtpConfiguration> e injetá-lo em controladores, serviços e repositórios como um singleton.

Vamos começar alterando a configuração do serviço no método ConfigureServices:

 public void ConfigureServices(IServiceCollection services)
 {
            var smtpConfiguration = new SmtpConfiguration();
            Configuration.Bind("SmtpConfiguration", smtpConfiguration);
            services.AddSingleton(smtpConfiguration);
            services.AddControllersWithViews();
 }

Agora podemos consumir o serviço de uma forma bem simples:

 public class HomeController : Controller
 {
        private readonly SmtpConfiguration _smtpConfiguration;
        public HomeController(SmtpConfiguration smtpConfiguration)
        {
            _smtpConfiguration = smtpConfiguration;
        }
        public IActionResult Index()
        {
            return View();
        }
    }

Executando o projeto e colocando um breakpoint no construtor HomeController vamos obter:

E estamos conversados...

"Porque, como o relâmpago ilumina desde uma extremidade inferior do céu até à outra extremidade, assim será também o Filho do homem no seu dia."
Lucas 17:24

Referências:


José Carlos Macoratti