Filtros de ação avançados no ASP.NET MVC
Veja nesse artigo como utilizar Filtros para resolver problemas complexos de forma simples. Os filtros nos fornecem uma técnica simples e poderosa de modificar, melhorar e/ou acrescentar determinados componentes em nossa aplicação.
Veremos
soluções para problemas complexos, como controle de transação por requisição,
gerenciamento de erros, autorização, autenticação e cache de dados de forma
bastante simples e bem detalhada, para ajudar no aprendizado e na
extensibilidade das soluções propostas.
Antes de aventurarmos no mundo do Filtro, ou Filter, devemos conhecercomo funciona os atributos (atributes). Um atributo não é nada mais do que uma classe que possui um comportamento um pouco diferente do que estamos acostumados a utilizar.
Atributos
Um atributo funciona como uma informação a mais que damos para uma determinada classe, ou um determinado método, parâmetro, etc. Na prática o mesmo funciona como uma anotação que fazemos para os elementos, que poderão ser utilizadas em tempo de execução.
Conheça algumas características de um atributo:
· Toda classe de Atributo deve conter um atributo informando para quais elementos da linguagem o atributo pode ser usado. Essa informação é definida através do atributo AttributeUsage.
· Os atributos são classes públicas derivadas de System.Atribute e devem ter pelo menos um construtor público.
· As classes podem possuir dois tipos de parâmetros, os chamados parâmetros posicionais, aqueles que devem ser especificados toda vez que o atributo for usado e são especificados como argumentos do construtor da classe do atributo. Já os parâmetros nomeados, são parâmetros que são opcionais, se os mesmos tiverem de ser usados, o nome do parâmetro deve ser informado. Confira nas Listagens 1 e 2 como são utilizados os parâmetros posicionais e os parâmetros nomeados, respectivamente.
Os parâmetros são restritos a valores constantes dos seguintes tipos:
- Tipos Simples (bool, byte, char, short, int, long, float e double).
- String.
- System.Type.
- Enums.
- Objeto (o argumento para o parâmetro de um atributo do tipo objeto deve ser um valor constante dos tipos acima).
- Matrizes unidirecionais de qualquer um dos tipos acima referido.
Listagem
1. Parâmetros Posicionais
01 [AttributeUsage(AttributeTargets.All)]
02 public class MeuAtributoAttribute : Attribute
03 {
04 }
Na Listagem 1 foi declarado um atributo chamado MeuAtributoAttribute, e está sendo utilizado um outro atributo para informar para quais elementos da linguagem podemos utilizar o atributo criado. O atributo chamado AttributeUsage é um exemplo de Parâmetro Posicional, pois o mesmo obriga que em sua utilização seja informado um parâmetro do tipo AttributeTargets.
Listagem
2. Parâmetros Nomeados
01 public class HomeController : Controller
02 {
03 [OutputCache(Duration = 10)]
04 public ActionResult Index()
05 {
06 return View();
07 }
08 }
Na Listagem 2 temos um exemplo da utilização de um parâmetro nomeado. Foi declarada uma Action chamada Index, e estamos informando com a utilização do atributo OutputCache, que estamos fazendo cache das chamadas ao mesmo e que o cache terá uma duração de 10 segundos. O atributo OutputCache não obriga a utilização de nenhum parâmetro, logo, para que possamos utilizar o parâmetro Duration devemos informar seu nome.
Para entendemos melhor, um parâmetro nomeado nada mais é do que uma propriedade, ou seja, para criar um parâmetro nomeado, basta criar uma propriedade que a linguagem suporta tal utilização. Lembrando que essa característica de parâmetro nomeado não é só para atributos, mas para qualquer classe. Confira na Listagem 3.
Listagem
3. Parâmetro Nomeado
01 public class Pessoa
02 {
03 public string Nome { get; set; }
04 }
05
06 class Program
07 {
08 static void Main(string[] args)
09 {
10 var pessoa = new Pessoa { Nome = “Welson Play” }
11 }
12 }
Podemos concluir com o exemplo apresentado que os parâmetros Nomeados não é uma característica dos atributos e sim da classe.
Uma conversão que é bastante utilizada pelos desenvolvedores é o sufixo Attribute para todos os atributos para que possamos diferenciá-los das classes comuns, e quando é utilizada o sufixo Attribute, o mesmo não é necessário na sua utilização. Um grande exemplo é o próprio atributo já mencionado anteriormente, o atributo OutputCache, na verdade o mesmo é declarado como OutputCacheAttribute, mas por ser um atributo, na sua utilização podemos retirar o sufixo e passar a utilizar apenas OutputCache.
Não é o foco desse artigo falar profundamente sobre atributos, mas foi necessário fazer uma rápida introdução para que possamos entender melhor o funcionamento de um filtro no ASP.NET MVC
Ciclo de Vida de Uma Requisição
No ASP.NET MVC os Controllers definem métodos de ação, as Actions, que normalmente têm uma relação um para um com as possíveis interações com o usuário, como clicar em um link ou enviar um formulário, por exemplo. Uma requisição é enviada para o controller designado e a action correspondente, que possua vez recebe os parâmetros passados. Se assim for o caso, processa os mesmos, e provavelmente devolve uma resposta para o solicitante.
Após a requisição enviada para o Controller ser processada, provavelmente é enviado um retorno para o cliente da solicitação, ou seja, a aplicação que o solicitou, seja web ou não. As respostas podem variar de acordo com a utilidade ou a função designada para a Action correspondente. Existem casos que o retorno pode ser uma página web, ou uma resposta JSON, XML ou até um HTTPStatusCodeResult.
Tudo começa com uma solicitação de uma aplicação cliente à aplicação Web através de uma URL, que funciona como um endereço do pedido ou da solicitação. O primeiro passo do ciclo de vida de uma requisição no ASP.NET MVC é o processo de Routing, que faz uma análise na URL para encontrar um padrão de rota
Essa análise, também conhecida como processo de Routing, é feita através de uma padronização definida na tabela de Rotas, configuradas na aplicação web, como mostra a Figura 1.
" [...] continue lendo...
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo