Entendendo o processo de execução de uma aplicação MVC


Requisições para uma aplicação ASP.NET MVC primeiramente passam por um objeto UrlRoutingModule,que é um módulo HTTP.Esse módulo analisa a requisição e faz uma seleção de route.O objeto UrlRoutingModule seleciona o primeiro objeto route compativell a requisição atual.(Um objeto route é uma classe que implementa RouteBase,e é geralmente uma instância da classe Route).Se não forem encontradas routes,o objeto UrlRoutingModule não faz nada e deixa a requisição cair para o processamento de requisição normal do IIS ou  ASP.NET.

A partir do objeto Route selecionado,o objeto UrlRoutingModule obtém o objeto IRouteHandler que é associado com a Route do objeto.Geralmente,numa aplicação MVC,esse será uma instancia do MvcRouteHandler.A instancia IRouteHandler cria um objeto IHttpHandler e passa este para o objeto IHttpContext.Por padrão,a instancia IHttpHandler para o MVC é o objeto MvcHandler.O objeto MvcHandler então seleciona o controller que irá por último controlar a requisição.

Nota:Quando uma aplicação MVC roda no IIS7.0,nenhuma extensão de nome de arquivo é requerida pra projetos MVC.Entretanto,no IIS6.0,o handler requer que você mapeie a extensão de nome de arquivo .mvc para o ASP.NET ISAPI DLL.

O módulo e o handler são pontos de entrada para o framework MVC.Eles realizam as seguintes ações:

  • Selecionam o controller apropriado na aplicação MVC.
  • Obtem uma instancia especifica do controller.
  • Chamam o método Execute do controller.

A tabela a seguir lista os estágios de execução de um projeto MVC:

Estágio Detalhes
Recebe a primeira requisição para a aplicação No arquivo global.asax,objetos Route são adicionados para o
objeto RouteTable.
Realiza o roteamento O módulo UrlRoutingModule usa o primeiro objeto Route
compativel,na coleção RouteTable pra criar o objeto RouteData,
que é então usado pra cria um objeto
RequestContext(IHttpModule).
Cria um request Handler MVC O objeto MvcHandler usa a instancia do RequestContext
para identificar o objeto IControllerFactory(geralmente
uma instancia da classe DefaultControllerFactory)pra criar
a instancia do controller.
Executa o controller A instancia do MvcHandler chama o método Execute do Controller
Invoca a ação A maioria dos controllers herdam da classe base Controller.
Para esses controles,o objeto ControllerActionInvoker
que é associado com o controller determina qual método
de ação da classe controller chamar,e depois chama o método.
Executa o resultado Um método de ação comum pode receber entradas do usuário,
preparar a resposta de dados apropriada e depois executar o
resultado retornando um tipo de resultado.Os tipos de resultado
que podem ser executados,são os seguintes:
ViewResult
(que renderiza uma view e é o mais frequentte
tipo de resultado utilizado);RedirectToRouteresult,
RedirectResult,ContentResult,JsonResult, e  EmptyResult.
Anúncios

MVC Visão geral

MVC Visão Geral

A arquitetura MVC separa a aplicação em 3 principais componentes:o model,a view e o controller.O ASP.NET NVC framework oferece uma alternativa aos web forms ASP.NET.O framework MVC é leve,assim como aplicações baseadas em Web Forms é integrado com elementos do ASP.NET como master pages e autenticações baseadas em membership.O  framework MVC está definido no namespace System.Web.Mvc.

MVC é um padrão de design que muitos desenvolvedores já estão familiarizados.Alguns tipos de aplicação se beneficiam do MVC framework.Outros irão continuar com o tradicional modelo baseado em web forms e postbacks.Outros tipos de aplicação irão combinar os dois modelos;nenhum modelo elimina o outro.

O framework MVC inclue os seguintes componentes:

  • Model: Model são as partes da aplicação que implementam a lógica no dominio dos dados.Geralmente,objetos do model recuperam e armazenam o estado no banco de dados.Por exemplo,um objeto produto pode recuperar dados do banco,operar neste,e depois escrever a informação atualizada de volta para a tabela produtos no SQL server.

Em aplicações pequenas,o modelo geralmente é uma separação conceitual em vez de fisica.Por exemplo,se a aplicação somente le um conjunto de dados e manda este para a view,a aplicação,não tem uma camada model  fisica e classes associadas.Nesse caso,o conjunto de dados,representa o objeto model.

  • Views:View são componentes que mostram a interface de usuário.Geralmente,esta é criada a partir do modelo de dados.Um exemplo seria view de edição de uma tabela de produtos que mostra textbox,drop-down lists e checkboxes baseado no estado atual do objeto produtos.
  • Controllers:Controllers são componentes que controlam a interação,trabalhando com o modelo e por último selecionando uma view que mostrará a interface.Numa aplicação MVC,a visão somente mostra a informação;o controller controla e responde a interação do usuário.Por exemplo,o controller controla valores querystring e transmite esses valores para o modelo,que em turnos consulta o banco, passando estes valores.

O padrão MVC ajuda você a criar aplicações que separam diferentes aspectos da aplicação.O padrão especifica onde cada tipo de lógica deve se localizar na aplicação.A lógica de interface pertence a view.A lógica de entrada pertence ao controller.A lógica de negócio pertence ao modelo.Essa separação ajuda você a administrar complexidades quando você cria a aplicação,porque permite você focar em um aspecto de implementação individualmente.Por exemplo,você pode focar na view sem depender da lógica de negócio.

Além da de administrar a complexibilidade,o padrão MVC torna fácil o teste de aplicações, mais fácil do que o modelo baseado em web forms.Por exemplo,numa aplicação web form,uma única classe pode ser usada para mostrar a saída e responder a entradas do usuário.Escrever testes automatizados para aplicações em web forms pode ser complexo,porque para testar uma página individual,você deve instanciar a classe Page,todos os seus controles filho, e classes dependentes da aplicação.Como muitas classes são instanciadas para rodar a página,pode ser dificil escrever  testes que foquem exclusivamente em partes individuais da aplicação.Testes para aplicações em web form  podem por isso ser mais dificil de implementar do que  testes em uma aplicação MVC.Mais ainda,testes em aplicação web form requerem um servidor web.O framework MVC desacopla os componentes e faz uso pesado de interfaces,que tornam possivel testar componentes individuais isolados do resto do framework.

O desacoplamento entre os 3 principais componentes da aplicação MVC também oferece desonvolvimento paralelo.Por exemplo,um desenvolvedor pode trabalhar na view,um segundo desenvolvedor pode trabalhar na lógica do controller,e um terceiro pode focar na lógica de negócio no model.

Decidindo quando criar uma aplicação MVC

Você pensar cuidadosamente em implementar uma aplicação usando o MVC framework ou o modelo baseado em Web forms.O framework MVC não substitui o modelo de web forms;

Antes de decidir em usar o framework MVC ou o modelo de web forms para um web site,leve em consideração as vantagens de cada método.

Vantagens em usar o framework MVC

Ofece as seguintes vantagens:

  • Torna facil administrar a complexibilidade dividindo a aplicação em model,view,controller.
  • Não usa viewstate .Isso torna o MVC ideal para desenvolvedores que querem controle total sobre o comportamento da aplicação.
  • Oferece melhor suporte para ‘test-driven development’(TDD)
  • Funciona bem para aplicações que são suportadas por um time grande de desenvolvedores e web designers que precisam de alto grau de controle sobre o comportamento da aplicação.

Vantagens em usar Web Forms

Oferecem as seguintes vantagens:

  • Suporta um modelo de eventos que preserva  o estado HTTP.
  • Usa um modelo de controle de página que adiciona funcionalidade para páginas individuais.
  • Usa viewstate,que pode tornar a administração de estados mais facil
  • Funciona bem em times pequenos de desenvolvedores e designers que querem tirar vantagem do grande número de componentes disponiveis para o rápido desenvolvimento de uma aplicação.

Download ASP.NET MVC

Veja também:
Entenda o processamento de uma aplicação MVC
Valeu pessoal.Até a próxima!

Interface ou classe abstrata

Devo usar classe abstrata ou interface?

As funcionalidade de  uma classe abstrata e de uma interface são bastante similares.Entretanto,há alguns prós e contras.

Herança

Uma classe no C# pode herdar somente de uma classe pai.Portanto,quando herdar uma subclasse de uma classe abstrata,a classe derivada,gastou a sua habilidade de participar na hierarquia de classes.

Herança única

C# suporta somente herança única:C# não suporta,herança de multiplas classes assim como o c++;Mas,usando classes abstratas e interfaces,programadores de C# podem obter o mesmo resultado,sem a bagunça e os problemas de  manutenção de multiplas heranças.

Value Types Polimorfismo

Value types no .NET são objetos descendentes de System.Object;eles não podem herdar de outros tipos.Mas podem implementar interfaces.Por exemplo,tipos primitivos – como Int32 – podem implementar a interface Icomparable,tornando se assim,comparaveis.

Versionamento

Uma classe abstrata pode conter implementações de interfaces.Isso simplifica o versionamento.Uma classe abstrata pode ser extendida adicionando novos métodos não abstratos com implementações padrão.

Uma interface não pode ser modificada sem quebra de contrato com as classes que a implementam.Uma vez que a interface esteja em uso,seus membros são fixos permanentemente.Um API baseado em interfaces só pode ser extendido,através de novas interfaces.

Flexibilidade de design

Interfaces oferecem maior flexibilidade em design,precisamente,porque podem ser implementadas por qualquer classe independente de sua hierarquia.

Melhores práticas

Use interfaces e classes abstratas em conjunto para melhorar seu código.
Use classe abstrata:

  • Quando criar uma class library a qual pode ser amplamente destribuida ou reusada – especialmente para clientes.Porque classes abstratas simplificam o versionamento.
  • Pra definir uma classe base em comum entre tipos familiares.
  • Pra oferecer comportamento padrão.

Use Interface:

  • Criar um projeto individual,que possa ser mudado no futuro,use uma interface porque oferece mais flexiblidade.
  • Para introduzir comportamento polifórmico sem subclasses e pra um modelo de multiplas heranças.Permitindo que um tipo especifico possa suportar multiplos comportamentos.
  • Pra desenvolver uma hierarquia poliformica para value types.
  • A intenção for de um contrato imutavel.

Resumo

A tabela a seguir compara interfaces e classes abstratas:

Classe abstrata Interface
Classes abstratas gastam sua opção de herança. Classes podem implementar múltiplas interfaces sem gastar a opção de herança.Mas não há implementações padrão.
Não pode ser instanciada.Exceto como parte de uma subclasse.Somente classes derivadas podem chamar um construtor de uma classe abstrata. Não podem ser instanciadas.
Define assinaturas abstratas de membros que a classe derivada deve implementar.De outra forma,a classe derivada em si também seria abstrata. Define assinaturas abstratas de membros .Todas as classes que implementam a interface devem implementa-los.De outra forma,ocorre um erro de compilação.
Novos membros não abstratos podem ser adicionados,que as classes derivadas não perderão a compatibilidade de versão. Extender uma interface com novos membros,quebra a compatibilidade de versão.
Opcionalmente,oferecer implementação padrão de um membro Virtual. Todos os membros são virtuais e não podem oferecer implementações.
Pode incluir fields. Não pode incluir fields.Mas pode declarar propriedades abstratas.

Confira mais sobre Interface vs Classe abstrata
Até a próxima!

A tabela a seguir compara interfaces e classes abstratas:

Erros Entity framework

Erro:Problem in mapping fragments each of the following columns…..is mapping to multiple conceptual side properties.

Geralmente esse ocorre em associação de duas chaves primárias de 2 tabelas diferentes.

Correção:É Preciso inserir a tag <ReferentialConstraint> no XML  do .edmx:

Eu tenho as seguintes tabelas:

Clique com o botão o botão direito no arquivo .edmx,escolha Abrir com…/Open with… –> XML Editor,e insira o seguinte código,(claro que depende do seu modelo de dados):

<Association Name=“EnqueteVoteEnquete>

<End Type=“First.EnqueteVote” Role=“EnqueteVote” Multiplicity=“0..1” />

<End Type=“First.Enquete” Role=“Enquete” Multiplicity=“1” />

<!– Necessário para corrigir o erro Mapping fragments………..conceptual properties–>

<ReferentialConstraint>

<Principal Role=“Enquete”>

<PropertyRef Name=“enquete_ID”/>

</Principal>

<Dependent Role=“EnqueteVote”>

<PropertyRef Name=“vote_ID”/>

</Dependent>

</ReferentialConstraint>

</Association>

Isso deve resolver o problema.

Erro:Erro no insert utilizando MySql.

Provavelmente o erro é no tipo da chave primária da tabela,que deve ser Int64.Vá no design do modelo .edmx,clique na Scalar Property que é a chave primária de sua entidade,aperte F4 e mude o tipo da EntityKey para INT64
Caso não de certo tente tirar o unsigned da coluna no banco.

Erro na associação entre uma foreign key que não é chave primária.

Esse erro ocorre porque uma foreign key que não seja primary key também,não pode ser declarada como Scalar property e “ponta” de uma association ao mesmo tempo.Você deve escolher entre um dos dois.Ex:Apague a scalar property da entidade e mantenha a associação.

Mais sobre o Entity framework:

Bom espero ter ajudado,até mais!

O que é LINQ? – Parte 1

O que é LINQ?

LINQ é um modelo de programação que permite a nós consultar e modificar dados independente da fonte de dados.É um conjunto de extensões que adicionam suporte nativo para consultas no .NET framework.Com suporte ao LINQ, ’queries’ tornaram-se ‘passageiros de primerira-classe no .NET framework.Possibilitando abstração de dados em diferentes dominios,LINQ  oferece uma maneira única de manusear dados.

Por que usar LINQ?

Hoje e sempre desenvolvedores são responsáveis por manusear dados em aplicações.Esses dados pertecem a diferentes dominios de dados e cada dominio vem com um único conjunto de regras para lidar EX:SQL é usado para bancos de dados relacionais,Xquery/DOM é usado pra manusear documentos XML e diferentes Application Programming Interface (APIs) são usados pra manusear arquivos de texto,objetos,gráficos,registros,diretórios ativos etc.Os desenvolvedores enfrentam o dilema de controlar diferentes dominios de dados com o mesmo propósito – o de manusear dados.Não seria bom ter um único conjunto de regras pra manusear  todas as nossas necessidades de dados.Aí é que entra o LINQ.LINQ oferece um modelo de programação unificado para manusear dados de diferentes fontes.Assim,podemos investir nossos esforços na camada de negócios  sem ter que ficar se preocupando com a sintaxe no manuseio dos dados.

LINQ  SINTAXE E FUNCIONAMENTO

Com LINQ,as noções de queries são agora conceitos do próprio .NET Framework.A sintaxe do LINQ  não  é só restrita a bancos de dados relacionais ao invés disso se aplica a uma ampla opção de dominio de dados.A seguir temos um exemplo de uma consulta em LINQ em um array de string:

string frutas = {“maca”,”banana”,”laranja”};

var query = from f in frutas where(f ==    “laranja” || f == “banana”) select foreach(var fruta in query)

{

ListBox1.Items.Add(fruta);
}

Vamos ver o que o código acima faz.Nós temos um array de strings e uma consulta do tipo SQL operando nesse array.A consulta retorna um subconjunto do array para um objeto do tipo var.O loop foreach passa pelos objetos e mostra o resultado.Simples não?

O ponto a se notar é que a mesma sintaxe acima pode ser aplicada a um banco de dados relacional,DataSets,Arquivos xml ou outro dominio de dados.Nossa interface para manusear os dados continua a mesma mas em outra ponta; nosso dominio de dados pode mudar dependendo de nossa necessidades.Essa habilidade de termos o mesmo conjunto de regras pra acessar dados entre diferente dominios é notável.Eu tenho certeza,que agora,você começou a perceber o poder do LINQ.

LINQ vem com diferentes tipos de providers para manusear diferentes dominios de dados.Não confunda a sintaxe do LINQ com diferentes providers.A sintaxe continua a mesma (com pequenas variações)entre diferentes providers.Mas as caracteristicas podem variar de um provider para outro ex:a mesma sintaxe LINQ vai servir tanto pra Node de um documento XML como uma linha de um Database.Cada provider é responsável por converter a expressão LINQ para uma forma compatível com a fonte de dados que está sendo utilizada.LINQ vem com os seguintes diferentes providers:

  • LINQ to Objects:Usado para  consultar coleções de objetos em memória
  • LINQ  to SQL:Usado para manusear dados do SQL SERVER e SQL SERVER COMPACT .
  • LINQ to Entities:Opera em entidade de objetos.
  • LINQ to DataSet:Pesquisa em datasets.
  • LINQ to XML:Manusear arquivos XML.

Em breve criarei a segunda parte,em futuros posts!