Escolha uma Página

Faaala Time, bom ou não?

No último post criamos a estrutura básica do projeto que utilizaremos para provar alguns conceitos relacionados ao feature toggle. Neste post daremos continuidade e implementaremos alguns mecanismos importantes. Bora la?

Se você não leu o último post, confira aqui.

Implementações

Na criação da estrutuda do projeto adiconamos também as bibliotecas de dependência. Uma das bibliotecas é o Config Cat. Iniciaremos nossa implementação através do arquivo FatureToggleFilterAttrbute.cs.

A estratégia é criar um atributo para “anotar” Actions nas classes de controller. Sendo assim, este atributo irá validar se o Feature Toggle definido no atributo está habilitado ou não. Se estiver habilitado, então a action é executada, caso contrário será retornado o status code 404 (not found):

public class FeatureToggleFilterAttribute : ActionFilterAttribute
    {
         protected readonly string _toggle;

        public FeatureToggleFilterAttribute(string toggle)
        {
            _toggle = toggle;
        }

        public override void OnActionExecuting(ActionExecutingContext context)
        {
            IConfigCatClient _configCatClient = context.HttpContext.RequestServices.GetService(typeof(IConfigCatClient)) as IConfigCatClient;

            if (_configCatClient != null) 
            {
                _configCatClient.ForceRefresh();

                if (!_configCatClient.GetValue(_toggle, false))
                    context.Result = new NotFoundResult();
            }
        }
    }
  • Na linha 1 adicionamos uma herança para a classe ActionFilterAttribute que é um tipo especial que acrescenta funcionalidades no fluxo de execução das actions, no caso, validar o feature toggle. Para maiores detalhes sobre filters no .net core, consultar aqui.
  • Nas linhas 3 a 18 definimos uma propriedade que irá conter o nome do feature toggle e obtemos o seu valor no construtor do atributo.
  • Nas linhas 12-19 são feitas as validações necessárias obtendo o client do configcat, obtido pelo contâiner de injeção de dependência do .net core, forçando a recuperação dos valores de toggles(linha 16) e finalmente validando se o toggle está ativo ou não.

Manteremos a implementação o mais simples possível neste momento.

No arquivo ConfiCatOptions.cs apenas adicionamos uma propriedade que precisaremos neste momento, Key, que irá conter a chave de conexão com o SDK do Config cat:

 public class ConfigCatOptions
    {
        public string Key { get; set; }
    }

Antes de alterar o arquivo IDogAPIService.cs, crie uma nova classe chamada DogServiceModel.cs na pasta Models:

public class DogServiceModel
    {
        public string Message { get; set; }   

        public string Status { get; set; }

        public int Code { get; set; }
    }

Esta classe apenas contém um objeto que será retornado ao consumir a API que utilizaremos neste exemplo. Esta API retornará um link aleatório contendo uma foto de algum cachorro com base em sua raça.

Agora altere a classe IDogAPIService.cs:

public interface IDogAPIService
    {
        [Get("/breed/{dogName}/images/random")]
        Task<DogServiceModel> GetDogImage(string dogName);
    }

Pontos importantes nesta classe:

  • É uma interface
  • Linha 3: Anotamos o método da interface com um atributo Get. Este atributo é definido pela library do Refit e diz que o método GetDogImage efetuará uma requisição GET a um recurso REST tendo como sufixo o path /breed/{dogName}/images/random. Observem que o atributo {dogName} tem o mesmo nome do parâmetro definido no método.
  • Linha 4: definição do método que recebe como parâmetro o nome de uma raça de cachorro e retorna um objeto DogServiceModel.

É uma abordagem diferente anotar o método de uma interface com um atributo que diz respeito a uma requisição HTTP. E este é um dos grandes benefícios do REFIT. Definida a interface, não será necessário implementar uma classe que faz a requisição HTTP para o serviço. O Refit cuidará desta abstração. Para saber mais sobre o refit, clique aqui.

Considerações finais

O artigo está ficando um pouco extenso e não desejo criar muitas dúvidas no momento. A ideia é simplificar para enteder, de fato, o objetivo da estratégia de utilização de feature toggles. Menos é mais. Então vamos parar por aqui, neste momento.
De uma forma resumida apenas criamos um filtro para abstrair a consulta de toggles habilitados ou não em nossas actions, implementamos a interface que será responsável por comunicar com um serviço externo, além de criar um model para representar o retorno da API, e implementamos uma classe para abstrair dados de configurações.

Você pode acessar o código desenvolvido até o momento: https://github.com/codefc/serie-feature-toggle

Creio que por hoje é só. Deixe seus comentários com dúvidas, críticas e sugestões e até o próximo post o vídeo.