ASP.NET MVC em Ação - s3.novatec.com.br · Capítulo 1 Introdução ao ASP.NET MVC Framework 31...

Click here to load reader

  • date post

    30-Nov-2018
  • Category

    Documents

  • view

    215
  • download

    0

Embed Size (px)

Transcript of ASP.NET MVC em Ação - s3.novatec.com.br · Capítulo 1 Introdução ao ASP.NET MVC Framework 31...

  • Jeffrey PalermoBen ScheirmanJimmy Bogard

    Prefcio de Phil Haack

    ASP.NET MVC em Ao

    Novatec

  • 29

    captulo 1Introduo ao ASP.NET MVC Framework

    Este captulo aborda:

    Execuo do projeto iniciador.

    Progresso por meio de exemplos do tipo Hello World.

    Roteamento bsico.

    Teste unitrio bsico.

    Dependendo de quanto tempo vem construindo aplicaes web na plataforma Microsoft, voc vai se identificar com algumas ou com todas as dores-de-cabea apresentadas em seguida. Na dcada de 1990, os desenvolvedores construam web-sites interativos usando programas executveis que rodavam em um servidor. Esses programas (Common Gateway Interface [CGI] era uma tecnologia comum naquela poca) aceitavam uma requisio de rede e eram responsveis por criar uma resposta em HTML. Templates eram criados sob demanda, e os programas eram difceis de serem escritos, depurados e testados. No final da dcada de 1990, a Microsoft, aps um breve flerte com os templates HTX e os conectores IDC, introduziu o Active Server Pages, ou ASP. O ASP trouxe os templates para as aplicaes web.

    A pgina de servidor era um documento HTML com scripts dinmicos misturados nele. Apesar de isso ter sido um grande passo rumo a alternativas, o mundo logo pre-senciou pginas de servidor enormes com cdigo indistinguvel da marcao HTML.

    No incio de 2002, surgiram o ASP.NET e o framework Web Forms. O Web Forms foi uma mudana completa para os desenvolvedores ASP, em parte porque moveu a maioria da lgica do programa para um arquivo de classe (denominado code-behind) e substituiu a marcao HTML por controles de servidor dinmicos escritos em uma sintaxe XML. Apesar de o desempenho ter aumentado e da experincia de depurao ter melhorado, novos problemas surgiram.

    O novo ciclo de vida do evento de postback do lado do servidor causou uma explo-so de atividade nos newsgroups, conforme desenvolvedores confusos procuravam por aquele evento mgico, no qual seriam adicionadas duas linhas simples de cdigo necessrias para fazer a pgina funcionar como desejado. ViewState, apesar de ser bom na teoria, desmoronou conforme as aplicaes aumentavam em complexidade.

  • ASP.NET MVC em Ao30

    Pginas simples ultrapassavam os 100KB de tamanho, j que o estado completo da aplicao tinha que ser armazenado na sada de cada pgina gerada. As boas prti-cas de desenvolvimento foram ignoradas quando ferramentas como o Visual Studio encorajaram a colocao de interesses relativos ao acesso de dados, como consultas SQL, dentro da lgica de visualizao. Talvez o maior pecado do Web Forms tenha sido o forte acoplamento a tudo que existe dentro do namespace System.Web. No havia esperanas de se realizarem testes unitrios em qualquer cdigo do arquivo code-behind, e atualmente encontramos mtodos Page_Load que usam vrias rvores para serem construdas. Apesar de as primeiras verses do Web Forms terem alguns reveses, o ASP.NET e, mais amplamente, o .NET Framework fizeram uma grande invaso no mercado de aplicaes web. Hoje vemos grandes websites, como CallawayGolf.com, Dell.com, Newsweek.com, WhiteHouse.gov e Match.com rodando em ASP.NET. A pla-taforma colocou-se prova no mercado e, quando combinado com o IIS executado no Windows, o ASP.NET pode suportar facilmente aplicaes web complexas que executam em grandes data centers.

    O framework ASP.NET MVC alavanca o sucesso do ASP.NET e das Web Forms, impul-sionando o ASP.NET adiante como lder no espao de desenvolvimento de aplicaes web. O framework ASP.NET MVC foi introduzido para simplificar as partes complexas do desenvolvimento de aplicaes Web Forms, enquanto retm o poder e a flexibilida-de do pipeline do ASP.NET. A infraestrutura do ASP.NET e do pipeline de requisio, introduzidos no .NET 1.0, permanecem os mesmos, e o ASP.NET MVC fornece suporte para o desenvolvimento de aplicaes ASP.NET usado o padro de apresentao Modelo-View-Controlador. Os interesses relativos ao modelo de dados, lgica da aplicao e apresentao dos dados so claramente separados, com a lgica da aplicao mantida em uma classe isolada das dependncias fortes relacionadas com a apresentao dos dados. Pginas de servidor tornam-se simples visualizaes (views), que no passam de templates HTML esperando para serem povoados com objetos (modelos) passados a elas pelo controlador. O ciclo de vida do evento postback deixa de existir, e a ViewState no mais necessria. Neste captulo, vamos avanar rumo s suas primeiras linhas de cdigo construdas sobre o ASP.NET MVC Framework. Aps essa introduo, voc estar pronto para tpicos mais avanados.

    Neste captulo, e ao longo de todo o livro, assumimos que o leitor esteja familiarizado com o ASP.NET. Se voc for novo no ASP.NET, por favor, familiarize-se com o pipeline de requisio do ASP.NET, bem como com o tempo de execuo do .NET. Ao longo deste captulo, conduziremos voc por meio da criao de um projeto de aplicao web com o ASP.NET MVC Framework, criando suas primeiras rotas, controladores e views. Vamos esmiuar a aplicao-padro e explicaremos cada parte dela. Em seguida, vamos estend-la, e voc criar seu primeiro controlador e sua primeira view. Inicialmente, vamos explorar o padro MVC e o template da aplicao padro fornecido com o framework.

  • 31Captulo 1 Introduo ao ASP.NET MVC Framework

    Integrando com aplicaes ASP.NET Web Forms ou migrando a partir delas Podemos criar telas que usem o ASP.NET MVC Framework, ao passo que outras telas continuam trabalhando com Web Forms? claro que podemos. Eles podem ser executados lado a lado at que toda a aplicao use o MVC. Usar o framework MVC no uma proposio do tipo tudo ou nada. Existem inmeras aplicaes ASP.NET em produo que usam Web Forms. Se uma equipe de software deseja migrar a aplicao de Web Forms para ASP.NET MVC, possvel fazer uma migrao por etapas e executar os dois, lado a lado, no mesmo domnio de aplicao. O ASP.NET MVC no substitui as bibliotecas e funcionalidades centrais do ASP.NET. Em vez disso, ele agrega s funcionalidades existentes do ASP.NET. O UrlRoutingModule, que registramos no arquivo de configurao de rede, avalia um URL entrante, relativo s rotas existentes. Se uma rota correspondente no for encontrada, o ASP.NET seguir em frente e usar o Web Forms para preencher a requisio, ento muito simples misturar e compatibilizar funcionalidades durante uma migrao ou com o propsito de estender a aplicao.

    Apesar do fato de que as Web Forms no sumiro to cedo, acreditamos que controladores, aes e views sero a maneira preferida de se escrever aplicaes ASP.NET daqui por diante. Mesmo com a Microsoft mantendo o suporte a ambas as opes (e o desenvolvimento da prxima verso do Web Forms continua ativo), acreditamos que o ASP.NET MVC Framework ser favorecido em detrimento do Web Forms, da mesma forma que vemos o C# sendo favorecido em detrimento do VB na documentao em conferncias da indstria e nos livros tcnicos.

    1.1 Desmembrando a aplicao-padroNesta seo, explicaremos o que o padro MVC e criaremos nossa primeira aplica-o web ASP.NET MVC. Concentraremo-nos primeiro no controlador, pois, na trade Modelo-View-Controlador (MVC), o controlador est no comando e responsvel por decidir quais objetos-modelo usar e quais views transmitir de volta para o usurio. O controlador est a cargo da coordenao e o primeiro a ser executado quando a requisio web chega aplicao. O controlador responsvel por decidir qual resposta apropriada para a requisio.

    O padro modelo-view-controlador no novo. Um princpio central do padro MVC separar a lgica de controle e a view, ou seja, uma tela. Uma view respon-svel apenas por apresentar a interface de usurio. Ao separar a lgica de domnio e desacoplar da view, o acesso aos dados e a outras chamadas a interface de usurio (UI) pode permanecer igual, mesmo quando a lgica e o acesso aos dados mudam dentro da aplicao. A figura 1.1 apresenta um diagrama simples da trade MVC.

    Perceba que o controlador possui uma relao direta com a view e o modelo, mas o modelo no precisa saber nada a respeito do controlador ou da view. A requisio

  • ASP.NET MVC em Ao32

    web ser tratada pelo controlador, e este decidir quais objetos-modelo usar e quais objetos-view transmitir.

    Modelo

    Controlador

    View

    Figura 1.1 Um diagrama simples para descrever o relacionamento entre o Modelo, a View e o Controlador. As linhas slidas indicam uma associao direta, e as linhas tracejadas indicam uma associao indireta

    (grfico e descrio usados com permisso da Wikipdia).

    Para comear, abriremos o Visual Studio 2008 SP1 e criaremos nosso projeto. A edio do Visual Studio faz diferena. Apesar de existirem maneiras de utilizar o ASP.NET MVC Framework sem o SP1, System.Web.Abstractions.dll e System.Web.Routing.dll fazem parte do GAC (cache de assembly global) no SP1. Voc pode usar o Visual Studio 2008 Professional, um Team Edition SKU, ou o Visual Web Developer Express SP1. Perceba que o ASP.NET MVC Framework construdo sobre o Web Application Projects, e, apesar de ser possvel faz-lo funcionar com websites, a experincia de desenvolvimento otimizada para uso com o Web Application Projects.

    NOTA Voc j deve ter o Visual Studio 2008 SP1 ou Visual Web Developer 2008 SP1, o .NET 3.5 SP1 e o ASP.NET MVC Framework devidamente instalados para prosseguir. O framework MVC um pacote independente construdo sobre o .NET 3.5 Service Pack 1. Os exemplos deste livro usaro o Visual Studio 2008 SP1, mas voc encontrar informaes sobre como usar o Visual Web Developer Express 2008 SP1, que gratuito, no website do ASP.NET MVC: http://www.asp.net/mvc

    Comearemos no Visual Studio 2008 Professional SP1 criando um novo projeto ASP.NET MVC Web Application. Ao abrir a caixa de dilogo New Project, certifique-se de que o .NET Framework 3.5 esteja selecionado. Se voc tiver o .NET Framework 3.0 ou 2.0 selecionado, o Visual Studio filtrar a lista e voc no ver o template de projeto para ASP.NET MVC Web Application. Agora que voc entende o bsico do padro e como instalar o framework MVC, mergulharemos no nosso primeiro projeto.

    1.1.1 Criando o projetoCriar o seu primeiro projeto ASP.NET MVC Web Application ser uma das coisas mais simples que voc far neste captulo. No Visual Studio 2008, quando o .NET Framework 3.5 est selecionado como framework-alvo, voc ver um novo template de projeto chamado ASP.NET MVC Web Application. Escolha esse template. O novo dilogo de projeto se parecer com o mostrado na figura 1.2.

  • 33Captulo 1 Introduo ao ASP.NET MVC Framework

    Figura 1.2 O projeto MVC Web Application um template de projeto adicionado s sees C# e VB.NET do dilogo New Project. Ele s fica disponvel quando voc tem o .NET Framework 3.5 selecionado como o

    framework-alvo.

    NOTA Outros starter kits e aplicaes de exemplo da comunidade do ASP.NET MVC esto disponveis no website do ASP.NET. No momento em que escrevemos, http://www.asp.net/community/projects/ e http://www.asp.net/mvc/ possuem vrios starter kits e aplicaes de exemplo para iniciar projetos ASP.NET MVC (bem como starter kits para ASP.NET Web Forms). As opes incluem:

    Kigg Starter Kit uma aplicao semelhante ao Digg.

    Contact Manager Sample Application.

    Storefront Starter Kit.

    Apesar dos starter kits serem bem simples, voc tambm deveria ver starter kits mais completos, como aqueles encontrados em http://CommunityForMvc.net. Este site contm um template vazio e outro completo com MvcContrib, StructureMap, NHibernate, NUnit, NAnt, AutoMapper, Tarantino, Naak, NBehave, Rhino Mocks, WatiN, Gallio, Castle, 7zip e outros.

    Se estiver comeando a desenvolver em .NET, voc deve se familiarizar primeiro com o template padro da Microsoft. Somente aps isso, passe a usar um starter kit mais robusto ou as aplicaes de exemplo fornecidas pela comunidade para ter um ponto de partida mais avanado. Quando voc tiver dominado o framework, considere a possibilidade de contribuir com seus prprios starter kits.

  • ASP.NET MVC em Ao34

    A primeira coisa a se observar que, em contraste com as estruturas praticamente vazias de um template de projeto padro do Web Forms, o template MVC padro cria vrias pastas: Content, Controllers, Models, Scripts e Views. Essas pastas representam parte das convenes de desenvolvimento de aplicaes MVC, que, se forem seguidas, podem transformar em um passeio a experincia de desenvolvimento com o framework.

    Por enquanto, as pastas mais importantes para voc, e com as quais voc deve se fa-miliarizar, so as nomeadas de acordo com as suas contrapartes no padro MVC (as pastas Model, View e Controller). Como era de se esperar, o propsito de cada uma delas fornecer uma separao lgica das trs reas de interesse do MVC, bem como apro-veitar uma funcionalidade interessante do Visual Studio que coloca as classes criadas dentro de namespaces, nomeados de acordo com as pastas em que elas so inseridas.

    A pasta Controller provavelmente a menos interessante. Esta deve conter apenas clas-ses que sero usadas como controladores ou classes-base e interfaces herdadas pelos controladores. A pasta Views especial porque conter o cdigo que provavelmente ser o mais familiar de todos para os desenvolvedores de Web Forms. A pasta Views contm as pginas aspx (views), ascx (views parciais) e as pginas-mestras usadas para apresentar os dados. Normalmente, voc ter uma pasta para cada controlador dentro da pasta Views, contendo as views que sero usadas por um controlador especfico, bem como uma pasta Shared, que conter views compartilhadas.

    Figura 1.3 A estrutura-padro de um projeto de aplicao web com o ASP.NET MVC Framework usa convenes para a disposio de arquivos.

  • 35Captulo 1 Introduo ao ASP.NET MVC Framework

    O caminho felizDesenvolvedores ASP.NET (e outros desenvolvedores que usam frameworks centralizados em convenes) costumam mencionar o Caminho Feliz. Isso uma referncia noo de que as convenes do framework MVC tornaro a experincia do desenvolvedor mais prazerosa e relativamente indolor. O framework MVC no exige que voc siga qualquer conveno em particular, mas quanto mais se distanciar do Caminho Feliz, maior ser o esforo solicitado do desenvolvedor. O projeto MvcContrib aperfeioa o caminho, e com certeza voc encontrar maneiras de aperfeio-lo em seu sistema. Permanecer no caminho lhe d um ganho enorme em consistncia.

    Para a maioria dos projetos no triviais, voc provavelmente no colocar seus mo-delos na pasta Models. De forma geral, uma boa prtica manter o seu modelo de domnio em um projeto separado para que outras aplicaes possam us-lo sem gerar uma dependncia sobre sua aplicao MVC. Recomendamos que coloque apenas os interesses relativos apresentao no projeto Web Application.

    No projeto-padro, voc deve estar familiarizado com o arquivo Default.aspx que lhe fornecido, e discutiremos em breve por que ele est ali. Primeiro, precisamos entender o conceito de rota.

    1.1.2 Suas primeiras rotasAs rotas sero discutidas com mais detalhes no captulo 5; no entanto, voc precisa saber o bsico de rotas para acompanhar esta seo. Apesar de o Web Forms ordenar uma conveno estrita de URLs, o framework MVC fornece um mecanismo que permite aos desenvolvedores manusear os URLs e faz-los mapear automaticamente para um objeto no sistema, que possa tratar a requisio web entrante. O roteamento foi adicionado ao ASP.NET no .NET Framework 3.5 Service Pack 1 e est disponvel para todas as aplicaes ASP.NET. O arquivo Global.asax.cs contm rotas bsicas que so fornecidas com o projeto MVC Web Application para ajud-lo a comear o trabalho. Antes de continuarmos, devemos definir o que uma rota.

    Uma rota uma definio completa de como despachar uma requisio web para um controlador, normalmente usando System.Web.Mvc.MvcRouteHandler. Antigamente, tnhamos pouco controle sobre o despacho de mensagens, sem depender de ferramentas exter-nas como filtros ISAPI ou HttpModules, cuidadosamente construdos para reescrever URLs. Com o Web Forms, o URL da requisio web estava fortemente acoplado localizao da pgina de que estava tratando a requisio. Se a pgina fosse nomeada Foo.aspx em uma pasta chamada Samples, o URL certamente seria algo como http://MvcContrib. Vrias equipes recorreram tcnica de reescrever URLs para conseguir algum controle sobre os URLs e como eram produzidos. Com o ASP.NET MVC

  • ASP.NET MVC em Ao36

    Framework, e com o ASP.NET 3.5 em geral, as rotas so cidads de primeira classe que podem ser gerenciadas diretamente na aplicao web. Comeamos definindo como queremos estruturar os nossos URLs. O template de projeto nos d algumas rotas para comearmos, como mostra a listagem 1.1.

    Listagem 1.1 Rotas-padro de um projeto novousing System.Web;using System.Web.Mvc;using System.Web.Routing;namespace Ch1GettingStarted{ public class MvcApplication : HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", Nome da rota "{controller}/{action}/{id}", URL com parmetros new {controller = "Home", action = "Index", id = ""} Valores-padro dos parmetros ); } protected void Application_Start () { RegisterRoutes(RouteTable.Routes); } }}

    As rotas devem ser definidas antes que qualquer requisio seja recebida pela apli-cao, ento o template de projeto adiciona as rotas ao mtodo Application_Start no arquivo Global.asax.cs. Mais adiante, voc ver que no deixamos as rotas nesse lugar, excetuando as aplicaes web mais triviais.

    NOTA Seguiremos as velhas boas prticas da separao de interesses (Separation of Concerns, ou SoC) e do princpio da responsabilidade nica, ou SRP (Single Responsibility Principle), transportando as rotas para uma localizao dedicada e separada por uma interface. Aprofundaremos esses princpios mais tarde, mas, resumindo, o interesse (ou responsabilidade) do mtodo Application_Start iniciar as operaes que devam acontecer no incio da vida da aplicao. A abordagem responsvel evitar realizar qualquer tipo de trabalho que deva acontecer no incio. Qualquer operao que deva acontecer no incio da aplicao deveria residir em classes separadas, que seriam apenas invocadas na ordem apropriada dentro do mtodo Application_Start.

  • 37Captulo 1 Introduo ao ASP.NET MVC Framework

    Perceba que a parte da rota equivalente ao URL simplesmente um mecanismo de correspondncia da requisio. Se o URL corresponde a uma rota especfica, ns especificamos qual controlador dever tratar a requisio e qual mtodo-ao dever ser executado. Voc pode criar quantas rotas quiser, mas uma rota j fornecida para voc. Essa rota segue o template {controller}/{action}/{id}.

    A rota cujo template {controller}/{action}/{id} uma rota genrica e pode servir para inmeras requisies web. Tokens so denotados pela incluso de {chaves}, e a palavra englobada pelas chaves corresponde a um valor que o framework MVC compreende. Os valores mais comuns que nos interessaro so controller e action. O valor de rota controller um valor especial que a classe System.Web.Mvc.MvcHandler usa para invocar a interface IControllerFactory. Esta ser a rota que usaremos no restante do captulo, ento ficaremos satisfeitos com um URL no formato http://MvcContrib.org/nome_controlador/nome_ao. O manipulador bsico de rotas ser uma instncia de IRouteHandler denominada MvcRouteHandler. Temos controle total e poderamos fornecer nossa prpria implementao de IRouteHandler se quisssemos, mas deixaremos isso para um captulo posterior.

    Antes de criarmos nosso primeiro controlador, vamos examinar o que h de diferente no arquivo web.config em um projeto MVC Web Application. As diferenas so fceis de detectar.

    Apenas procure por Routing ou MVC. Uma diferena visvel que um novo IHttpModule registrado no arquivo de configurao. Observamos a existncia do UrlRoutingModule na listagem 1.2.

    Listagem 1.2 Adio exclusiva ao arquivo web.config

    O UrlRoutingModule avalia uma requisio e verifica se ela corresponde a alguma rota armazenada na RouteTable. Se a rota corresponder, ele redefine o manipulador-padro (IHttpHandler) no caso dessa requisio, de forma que o framework MVC acabe por manipular a requisio. Vamos examinar nosso primeiro controle como um meio de tratar uma rota para o URL /home. Na prxima seo veremos como todas as peas do projeto iniciador (starter) se encaixam.

    1.1.3 Adotando o projeto iniciadorVamos passar rapidamente pelo projeto iniciador, observando cada poro de cdigo fornecida. Isso servir de exemplo sobre como juntar o cdigo ao escrever uma apli-cao com a camada de apresentao fornecida e potencializada pelo ASP.NET MVC Framework. Antes de observarmos o cdigo, execute a aplicao web pressionando CTRL + F5 e voc dever ver uma tela que lembra a figura 1.4.

  • ASP.NET MVC em Ao38

    Figura 1.4 O projeto iniciador vem com um layout bsico e CSS.

    O projeto iniciador vem com alguma navegao, um Log On e contedo. O CSS fornece formatao simples sobre o XHTML. Perceba que o URL na barra de endereo /. "/home" tambm trar a mesma pgina, j que nossa rota especifica home como o controlador-padro. Esse URL no tem uma extenso, portanto, se estiver planejando executar sua aplicao no IIS 6, dever adicionar um mapeamento-curinga ou instalar um filtro ISAPI que fornea essa funcionalidade. A implantao no IIS 6 ser vista com mais detalhes no captulo 10.

    J que voc est se familiarizando com o pipeline de requisio do ASP.NET, revisa-remos rapidamente como essa requisio encontra seu caminho at um controlador ASP.NET MVC. Aqui est um esboo de como a requisio caminha pelo ASP.NET at o controlador e, em seguida, pela view:

    1. A requisio chega em /Home.

    2. O IIS determina que a requisio deve ser tratada pelo ASP.NET.

    3. O ASP.NET d uma chance a todos os HttpModules para que modifiquem a re-quisio.

    4. O UrlRoutingModule determina que o URL corresponde a uma rota configurada na aplicao.

    5. O UrlRoutingModule pega o IHttpHandler apropriado a partir do IRouteHandler usado na rota correspondente (MvcRouteHandler, normalmente) como o manipulador da requisio.

    6. O MvcRouteHandler constroi e retorna um MvcHandler.

    7. O MvcHandler, que implementa IHttpHandler, executa ProcessRequest.

    8. O MvcHandler usa IControllerFactory para obter uma instncia de IController que usar o controller para rotear os dados da rota {controller}/{action}/{id}.

    9. O HomeController encontrado, e seu mtodo Execute invocado.

  • 39Captulo 1 Introduo ao ASP.NET MVC Framework

    10. O HomeController invoca a ao Index.

    11. A ao Index adiciona objetos ao dicionrio ViewData.

    12. O HomeController invoca o ActionResult retornado pela ao, que exibe uma view.

    13. A view Index na pasta Views exibe os objetos de ViewData.

    14. A view, derivada de System.Web.Mvc.ViewPage, executa seu mtodo ProcessRequest.

    15. O ASP.NET exibe a resposta no navegador.

    Esses passos representam simplificadamente a vida de uma requisio tratada pelo ASP.NET MVC Framework. Se estiver curioso sobre os detalhes, consulte o cdigo-fonte em http://www.codeplex.com/aspnet. Os 15 passos so suficientes para compreen-der como escrever cdigo, baseado no ASP.NET MVC Framework, e na maior parte do tempo voc dever prestar ateno apenas no controlador e na view. Voc j viu a rota no projeto iniciador. Vamos dar uma olhada em HomeController, mostrado na listagem 1.3.

    Listagem 1.3 O HomeControllerusing System.Web.Mvc;namespace Ch1GettingStarted.Controllers{ [HandleError]

    public class HomeController : Controller { public ActionResult Index() Ao-padro do controlador {

    ViewData ["Message"] = "Welcome to ASP.NET MVC!"; return View(); Retorna a view-padro da ao } public ActionResult About() Outro mtodo-ao { return View(); } }}

    Perceba como simples o controlador. No h muito cdigo gerado para destrinchar-mos, e cada mtodo-ao retorna um objeto derivado de ActionResult. Esse controlador deriva de System.Web.Mvc.Controller . Provavelmente voc considerar esta classe-base adequada, mas existem outras que voc pode escolher no projeto MvcContrib, e, conforme o tempo passa, bem provvel que a comunidade disponibilize muitas outras. Tambm pode ser uma boa prtica criar o seu prprio supertipo de camada para usar em sua aplicao.

  • ASP.NET MVC em Ao40

    Dentro de cada mtodo-ao, normalmente voc colocar objetos em um dicionrio chamado ViewData . Esse dicionrio ser passado view que est sendo exibida. O controlador pode fornecer qualquer objeto que a view solicite por meio desse dicion-rio ViewData; o objeto primrio que a view exibir dever ser atribudo propriedade Model do ViewData. Isso pode ser feito automaticamente, passando-se o objeto para o mtodo View() do controlador. No projeto iniciador, os objetos so strings simples, mas, em sua aplicao, voc usar objetos mais complexos, como os mostrados na figura 1.5.

    Figura 1.5 Classes que derivam de ActionResult. Essa imagem foi retirada do .NET Reflector da Red Gate.

    Cada ao-padro retorna o resultado do mtodo View(), que retorna um objeto System.Web.Mvc.ViewResult. Essa subclasse de ActionResult provavelmente ser um resultado bem comum, j que sua aplicao ter vrias telas. Em alguns casos, voc pode usar os outros tipos de ActionResult mostrados na figura 1.5. A ao do seu controlador pode retornar qualquer tipo. A classe-base Controller chamar ToString() em seu objeto e retornar essa string em um objeto ContentResult. Em seguida, verificaremos a view mostrada na listagem 1.4, que pode ser encontrada dentro do projeto no seguinte caminho: /Views/Home/Index.aspx.

    Listagem 1.4 Uma view simples

    Home Page

    To learn more about ASP.NET MVC visit http://asp.net/mvc.

  • 41Captulo 1 Introduo ao ASP.NET MVC Framework

    A view mostrada na listagem 1.4 a exibida no navegador, mostrada na figura 1.4. Com o framework MVC, arquivos de marcao no usam arquivos code-behind. Como a view usa o mecanismo de templates do Web Forms, voc at poderia utiliz-los, mas por padro apenas um arquivo simples de marcao gerado.

    Essa view usa uma pgina-mestra (master page), como voc pode ver no atributo MasterPageFile na diretiva Page. A pgina-mestra pode ser especificada pelo controlador por uma questo de compatibilidade com vrios mecanismos de views, mas alguns deles suportam a especificao do layout pela view, que o caso do mecanismo de views Web Forms, o mecanismo-padro que acompanha o framework MVC.

    NOTA ViewResult usa a interface IViewEngine, a qual uma abstrao que permite o uso de qualquer mecanismo de apresentao de uma view. Mecanismos de views sero abordados com mais profundidade posteriormente, mas algumas alternativas podem ser encontradas no projeto open source MvcContrib.

    No corpo dessa view, as tags do lado do servidor esto extraindo objetos de ViewData e passando-os junto com o HTML. A responsabilidade da view pegar objetos do ViewData e pass-los adiante, para serem consumidos pelo usurio. A view no decide o que exibir, e sim apenas como exibir. O controlador j decidiu o que precisa ser exibido.

    Na listagem 1.5, examine o cdigo do layout. Voc ver imediatamente que essa uma pgina-mestra simples, no muito diferente daquelas encontradas no Web Forms. A dife-rena que as pginas-mestras de projetos MVC no precisam usar arquivos code-behind.

    Listagem 1.5 A pgina-mestra do projeto iniciador

    My MVC Application Exibe outra view

  • ASP.NET MVC em Ao42

    Exibe hiperlinks

  • 43Captulo 1 Introduo ao ASP.NET MVC Framework

    { [TestClass] public class HomeControllerTest { [TestMethod] public void Index() { HomeController controller = new HomeController(); ViewResult result = controller.Index() as ViewResult; ViewDataDictionary viewData = result.ViewData; Assert.AreEqual("Welcome to ASP.NET MVC!",viewData["Message"]); } }}

    Acredite ou no, j percorremos o projeto iniciador do ASP.NET em sua totalidade, e agora voc conhece o bsico desse novo framework. Obviamente, veremos tpicos mais complexos ao longo deste livro, e se algum deles ao longo do caminho no entrar na sua cabea, por favor, abra o Visual Studio e investigue-o enquanto l. Trabalhar com o cdigo diretamente, enquanto l este texto, dar a voc uma compreenso slida dessa tecnologia. Na verdade, agora uma boa hora para baixar os cdigos de exemplo deste livro e abrir a aplicao-padro do seu IDE.

    1.2 Seu primeiro controlador ASP.NET MVC desde o princpioObserve a listagem 1.7 para entender como uma requisio web processada pelo controlador. Perceba que o nico requisito implementar a interface IController.

    Listagem 1.7 Nosso primeiro controladorusing System;using System.Web.Mvc;using System.Web.Routing;namespace MvcApplication.Controllers{

    public class HelloWorld1Controller : IController { public void Execute(RequestContext requestContext) { requestContext.HttpContext.Response.Write( "Hello World1"); } }}

  • ASP.NET MVC em Ao44

    Semelhante a tudo no ASP.NET MVC Framework, h muito pouco que o desenvol-vedor precisa fazer para criar funcionalidades customizadas. No caso do controla-dor, o nico vou repetir o nico requisito que a classe implemente a interface IController . Essa interface requer apenas que voc implemente um nico mtodo, Execute. A forma como voc vai tratar a requisio fica completamente por sua conta. No controlador da listagem 1.7, estamos violando intencionalmente todos os prin-cpios racionais da programao, bem como a Lei de Demeter, para que consigamos escrever a mensagem Hello World na tela o mais rpido possvel. Nesse caso, escolhi no fazer uso de uma view. Em vez disso, estou formulando uma marcao HTML incompleta e direcionando-a ao fluxo de resposta. Vamos executar o exemplo repare na sada, mostrada na figura 1.6. No cdigo da soluo que vem com o livro, voc pode encontrar o HelloWorldControllerTest que ilustra como realizar o teste unitrio de um controlador simples como esse.

    Figura 1.6 Nossa aplicao web executando no navegador. Perceba o URL simples e a ausncia da extenso .aspx.

    A listagem 1.7 mostra o poder completo e absoluto que voc tem quando cria uma classe controladora. muito importante ter controle completo; no entanto, na maior parte do tempo, estaremos trabalhando com uma poro de cenrios que se repeti-ro inmeras vezes. Para esses cenrios, o produto fornece uma classe-base que nos d funcionalidades extras. A classe-base para esses controladores comuns System.Web.Mvc.Controller. Ela implementa o mtodo Execute para ns e usa os valores de rota para chamar diferentes mtodos-ao, dependendo dos valores-padro de URL e rota.

    NOTA System.Web.Mvc.Controller apenas uma das opes de classe-base que podem ser escolhidas para os seus controladores. Como mencionado anteriormente, normalmente apropriado criar seu prprio supertipo de camada para todos os seus controladores. Esse tipo pode herdar de System.Web.Mvc.Controller, implementar IController ou derivar de qualquer outra classe-base controladora.

    Nosso primeiro uso da classe-base Controller precisar de apenas um mtodo-ao adotaremos a conveno da ao-padro e a chamaremos de Index. Observe na listagem 1.8 com o que nosso controlador se parece, enquanto usamos a classe-base Controller. Essa classe-base implementa a interface IController para ns e fornece a capacidade de invocar mtodos-ao, baseada no objeto Route atual.

  • 45Captulo 1 Introduo ao ASP.NET MVC Framework

    Listagem 1.8 Usando a classe-base Controllerusing System.Web.Mvc;namespace MvcApplication.Controllers{ public class HelloWorld2Controller : Controller Herda de Controller { public string Index() { return "Hello World2"; } }}

    O mtodo-ao pblico Index tudo que necessrio para esse controlador ser invo-cado via web. Mtodos-ao de contedo simples no precisam retornar ActionResult. Retornar qualquer outro tipo resultar naquele objeto sendo passado como contedo para o fluxo de resposta.

    Se apontarmos nosso navegador para /HelloWorld2, veremos que nosso controlador envia uma resposta ao navegador igual mostrada na figura 1.7:

    Figura 1.7 A pgina web tem uma sada semelhante anterior. O resultado final o mesmo, ainda que a implementao do controlador tenha mudado.

    Agora que sabemos como modelar um controlador, exploraremos nossa primeira view.

    1.3 Nossa primeira viewRecorde que o ASP.NET MVC Framework usa uma conveno para localizar views. A conveno encontrar um arquivo .aspx em uma rvore de diretrios que cor-responda a /Views/nome_controlador/nome_ao.aspx. Em nosso prximo exemplo, modificaremos o controlador invocando um mtodo da classe-base Controller cha-mado View(). Vamos vincular o modelo, que uma string com o texto Hello World, a uma entrada do objeto ViewDataDictionary na propriedade ViewData da classe-base Controller. Essa instncia de ViewDataDictionary ser encaminhada view. Apesar de

  • ASP.NET MVC em Ao46

    ViewData ser um ViewDataDictionary, recomendamos que voc dependa apenas da interface IDictionary se voc estiver substituindo o mecanismo de views. Meca-nismos de views sero discutidos mais detalhadamente no captulo 4. Na listagem 1.9, vemos que nossa ao retorna ActionResult em vez de string. Aps o retorno de um mtodo-ao, o ActionResult executado, realizando o comportamento apropriado que, neste caso, seria exibir uma view. Examine a listagem 1.9 para entender a implemen-tao atual de nosso controlador. ViewData contm o objeto que ser encaminhado view. O mtodo View() tambm permite passar um nico objeto view que fica, ento, acessvel pelo ViewData.Model, que exploraremos posteriormente.

    Listagem 1.9 Usando uma view para exibir o modelousing System.Web.Mvc;namespace MvcApplication.Controllers{ public class HelloWorld3Controller : Controller { public ActionResult Index() { ViewData.Add("text", "Hello World3"); Adiciona objetos a ViewData return View(); } }}

    Se estiver acompanhando este exemplo, dever criar uma pasta HelloWorld3 dentro de /Views em seu projeto, conforme mostra a figura 1.8.

    Figura 1.8 A localizao correta da pasta HelloWorld3 dentro da pasta /Views. A fbrica-padro de views usa essa conveno. Voc pode redefinir esse comportamento, se desejar.

  • 47Captulo 1 Introduo ao ASP.NET MVC Framework

    Em seguida, adicione uma view ao projeto dentro de /Views/Helloworld3. Voc pode usar o dilogo New Item do menu Project e selecionar MVC View Page; uma forma mais rpida usar o menu de contexto (boto direito do mouse) sobre a ao e se-lecionar Add View..., como mostra a figura 1.9. Essa ferramenta criar uma view com o nome correto dentro da pasta correta. Seu projeto dever agora estar semelhante figura 1.8. Nossa nova view, Index.aspx, reside na pasta HelloWorld3.

    Figura 1.9 Adicionando a view ao nosso projeto, por meio do menu de contexto.

    O nosso cdigo de marcao dentro da view ser bem simples. Afinal, essa aplicao to trivial que tudo que ela faz mostrar Hello World3 na tela em letras grandes. Usaremos os operadores do lado do servidor, , para extrair o modelo (que uma string) do dicionrio de ViewData e exibi-lo na tela. A listagem 1.10 mostra a marcao para a view. A classe-base System.Web.Mvc.ViewPage. Esta uma diferena importante com relao ao Web Forms.

    Listagem 1.10 Acessando ViewData de dentro da view

    O fluxo de nosso controlador para nossa view simples. O controlador indica um ou mais objetos que sero encaminhados view, ento, opcionalmente, especifica o nome da view. O framework MVC localiza a view, instancia-a, transmite o ViewData e faz a view passar a si prpria ao fluxo de resposta. A classe-base ViewPage suporta totalmente o processo de transmisso de dados, mas ViewState, postbacks e eventos de postback do lado do servidor no mais acontecem. Eventos de exibio ainda so disparados, pois ViewPage deriva de System.Web.UI.Page.

  • ASP.NET MVC em Ao48

    A nica responsabilidade da view transformar objetos passados a ela em HTML. Esse um ponto-chave do SoC, uma prtica importante que a Microsoft est fo-calizando com este produto. O controlador no sabe como a view est fazendo a formatao. O nico ponto de acoplamento que o controlador nomeia a view, seja implicitamente com o nome da ao, seja explicitamente com o mtodo View(). No importa que o System.Web.Mvc.WebFormViewEngine esteja executando. O mesmo controlador poderia funcionar muito bem com uma view do NVelocity (suportado pelo Mvc-Contrib), j que o nico acoplamento do controlador com a view o nome da view. Por enquanto, encaminharemos Hello World3 view, e a figura 1.10 mostra a pgina desenhada. Esse exemplo mostra como botar um caso simples para funcionar, mas existem questes de manuteno, s quais voc deve atentar enquanto constroi uma aplicao com esse framework.

    Figura 1.10 A sada semelhante dos exemplos anteriores, exceto que agora temos uma pgina HTML completa e no apenas um fragmento HTML.

    1.4 Assegurando a manuteno da aplicaoVoc deve ter se encolhido de medo quando viu que o objeto de modelo de domnio estava sendo inserido em um IDictionary, com uma chave de string como a forma de identificao do objeto na view. O .NET nos condicionou a querer que tudo seja fortemente tipado, ento identificadores em string so algumas vezes vistos como negativos. Esse ponto subjetivo e controverso, e voc tem vrias opes, dependendo de suas preferncias.

    NOTA Usar um dicionrio para passar objetos entre diferentes partes de uma aplicao (tipicamente chamado de saco de propriedades) permite que vrias partes da aplicao fiquem fracamente acopladas. O lado negativo que os objetos que saem do saco de propriedades precisam passar por operaes de converso (casting), antes de serem usados.

    O uso de um IDictionary para ViewData o mecanismo-padro na classe-base Controller. Conforme o nmero de objetos encaminhados view aumenta, fcil criar auxiliares nela, que evitem operaes de converso espalhadas por todo lado. No

  • 49Captulo 1 Introduo ao ASP.NET MVC Framework

    entanto, muitas aes do controlador encaminharo apenas um objeto para a view e, para esses casos, podemos fazer uso da propriedade ViewData.Model, bem como das views fortemente tipadas. Para o nosso prximo exemplo, realizaremos uma pequena alterao no controlador e na view para permitir uma referncia fortemente tipada.

    A listagem 1.11 mostra o nosso controlador descartando o uso do IDictionary e passando o objeto de modelo de domnio diretamente ao mtodo View(). Isso funciona bem em vrios cenrios, inclusive em aplicaes de grande porte com o uso de um modelo de view, que um objeto de apresentao modelado especificamente para ser usado em uma nica view. No caso de views compostas, pode ser necessrio usar ViewData como um dicionrio, mas as views parciais, abordadas no captulo 4, tambm podem dar suporte a views compostas.

    NOTA Na listagem 1.11, tivemos que transformar a string Hello World4 em um objeto, quando a passamos ao mtodo View(). Isso necessrio porque uma das sobrecargas de View() aceita uma string como parmetro nico, sendo usada para especificar uma view em particular que ser exibida.

    Listagem 1.11 Passando o modelo de apresentao ao mtodo Viewusing System.Web.Mvc;namespace MvcApplication.Controllers{ public class HelloWorld4Controller : Controller { public ActionResult Index() { return View((object)"Hello World4"); Converso realizada, para que a sobrecarga correta seja chamada } }}

    Temos disponvel uma propriedade Model (um atalho para ViewData.Model) que o tipo declarado como sendo o parmetro genrico de ViewPage na tag Inherits. Na listagem 1.12 optamos por System.Web.Mvc.ViewPage. A classe-base genrica nos permite tipar fortemente a propriedade ViewData.Model, porque a propriedade ViewData do tipo ViewDataDictionary, e a propriedade Model do tipo T.

    Listagem 1.12 View fortemente tipada com pgina-mestra

    ! I'm strongly typed in a layout!

  • ASP.NET MVC em Ao50

    Nesse exemplo, a view escolheu a pgina-mestra, mas, como dissemos anteriormente, voc tambm pode escolher a pgina-mestra dentro da ao do controlador. A escolha sua, mas nem todos os mecanismos de views suportam a especificao da pgina-mestra pela view, ento, caso exista a possibilidade de precisar alterar o mecanismo de views posteriormente, talvez seja melhor considerar especificar a pgina-mestra no controlador. O lado negativo disso que voc aumenta o acoplamento do con-trolador com as views.

    Pginas-mestras funcionam da mesma forma que no Web Forms para criao de templates, mas o postback do lado do servidor e os mecanismos de ViewState so irre-levantes. Exibio a nica responsabilidade da view e da pgina-mestra. A listagem 1.13 mostra nossa pgina-mestra, que esboa a estrutura da pgina. O layout declara System.Web.Mvc.ViewMasterPage como o tipo-base.

    Listagem 1.13 O layout da nossa view

    Hello!!

    Se executarmos o projeto (CTRL + F5) e apontarmos o nosso navegador para /HelloWorld4, observaremos a nossa view fortemente tipada e a pgina-mestra em ao. Para dar destaque, demos uma ordem contundente, como mostra a figura 1.11. A maioria das views que usaremos neste livro usaro a classe-base ViewPage para permitir uma propriedade Model fortemente tipada e o uso facilitado de modelos de view, que sero abordados no captulo 2.

    Parabns! Voc acabou de criar seu primeiro controlador, e ele lida perfeitamente com suas prprias responsabilidades. Deste ponto em diante, no cobriremos mais cada pequeno passo de desenvolvimento com o framework MVC. Se voc est lendo este livro, j deve estar bem experiente com o ASP.NET, ento abordaremos apenas

  • 51Captulo 1 Introduo ao ASP.NET MVC Framework

    os itens que so novos no ASP.NET MVC Framework. Usaremos as melhores prticas e tcnicas avanadas de desenvolvimento de software ao longo dos exemplos. A pri-meira prtica importante que abordaremos ser o teste unitrio. Como o framework MVC nos permite manter os nossos controladores separados das views, podemos testar facilmente a lgica de controle. Consideramos os testes uma parte importante para iniciar os trabalhos com o framework MVC, ento tocaremos no assunto agora e manteremos uma forte nfase em testes ao longo do livro. Apesar do fato de no reproduzirmos todos os testes unitrios neste livro, voc poder encontrar mais testes unitrios nos exemplos do livro, que podem ser baixados do website da editora (www.manning.com/ASP.NETMVCinAction).

    Figura 1.11 Esta a nossa view finalizada, completa com layout, tipagem forte e um pouco de CSS para dar uma apimentada.

    1.5 Testando as classes controladorasPara esta seo, voc precisar ter instalado o framework de testes unitrios NUnit. Ele pode ser encontrado em http://www.nunit.org, e gratuito. Aps instalar a ltima verso, abra a interface grfica do NUnit e selecione Tools > Options > Visual Studio ( esquerda) e marque a opo que diz Enable Visual Studio Support. Isso facilitar trabalhar com o NUnit de dentro do Visual Studio.

    Agora retorne ao projeto de teste unitrio que criamos anteriormente. Voc precisar remover as referncias a MSTest e adicionar uma referncia a NUnit. Ns criamos a classe HelloWorld4ControllerTester para abrigar os testes unitrios que verificam se o controlador funciona corretamente. Veja na figura 1.12 que estamos agrupando a afixao dos testes unitrios de controladores em uma pasta Controllers. Conforme voc navega pelas listagens de cdigo, perceber que criamos stubs de vrias classes de que o controlador necessita para funcionar. Esse exemplo de teste unitrio o mais simples que voc ver neste livro. A listagem 1.14 descreve a afixao do teste do NUnit para o HelloWorld4Controller.

    Listagem 1.14 Afixao de teste unitrio com o NUnitusing System.Web.Mvc;using MvcApplication.Controllers;using NUnit.Framework;

  • ASP.NET MVC em Ao52

    using NUnit.Framework.SyntaxHelpers;namespace MvcApplicationTest.Controllers{ [TestFixture] public class HelloWorld4ControllerTester { [Test] public void IndexShouldRenderViewWithStringViewData() {

    var controller = new HelloWorld4Controller(); var viewResult = (ViewResult) controller.Index(); Assert.That(viewResult.ViewName, Is.EqualTo("")); Assert.That(viewResult.ViewData.Model, Is.EqualTo("Hello World4")); } }}

    Figura 1.12 No seu projeto de teste unitrio, aps adicionar uma referncia a nunit.framework.dll, voc estar pronto para adicionar uma afixao de teste.

    Vamos examinar nosso teste unitrio simples dentro de HelloWorld4ControllerTester. Nosso teste o Index-ShouldRenderViewWithStringViewData. Criamos uma instncia da clas-se que est sendo testada, HelloWorld4Controller . Chamamos, ento, nosso mtodo Index, capturando o ActionResult retornado. O nosso teste espera que isso seja uma instncia de ViewResult, ento transformamos o retorno como tal. Se o cdigo retornar o tipo errado, o teste falhar de maneira apropriada. No final do teste, asseguramos facilmente as nossas expectativas . Os testes unitrios costumam seguir um fluxo de disposio, ao e afirmao, e esse teste um exemplo perfeito disso. Este foi um teste unitrio bem simples, e o captulo 3 abordar o teste unitrio de controladores

  • 53Captulo 1 Introduo ao ASP.NET MVC Framework

    com mais profundidade. A figura 1.13 mostra o teste sendo executado com o UnitRun do JetBrains. UnitRun tambm uma funcionalidade do ReSharper.

    Criar testes unitrios automatizados para todo o cdigo e executar esses testes a cada compilao do software ajudar a certificar que, conforme a aplicao cresce em com-plexidade, o software continua manutenvel. Geralmente, conforme a aplicao cresce, ela fica mais difcil de manter. Um pacote de testes automatizados ajuda a contra-atacar a tendncia natural entropia. Felizmente, fcil testar controladores com o framework MVC. Na verdade, a equipe da Microsoft usou o desenvolvimento orientado a testes (test-driven development, ou TDD), enquanto desenvolvia o framework.

    Figura 1.13 Quando executamos esse teste unitrio com o JetBrains ReSharper, ele passa, conforme esperado.

    NOTA Junto com o framework MVC, a Microsoft encapsulou parte do cdigo do ASP.NET e forneceu classes abstratas para algumas das APIs-chave, como HttpResponseBase, HttpRequestBase e a mais importante de todas, HttpContextBase. Uma pesquisa no Google revelar como inmeras pessoas tiveram problemas para testar o HttpContext por causa dos seus membros de tipo static e sealed. Fornecer classes abstratas para essas APIs-chave diminui o acoplamento a elas, aumentando a capacidade de teste.

    Mencionamos os testes unitrios vrias vezes no texto, e importante entender a conexo deles com o TDD. O desenvolvimento orientado a testes um estilo de desen-volvimento em que testes unitrios (e outros testes) so criados antes de se escrever o cdigo que far com que esses testes passem. Neste captulo, ns no aderimos estri-tamente ao processo de TDD, na tentativa de focalizar nas reas-chave do framework MVC sem adicionar a sobrecarga mental de um novo processo de desenvolvimento.

    boa prtica garantir que, conforme voc escreva seus testes unitrios, eles no in-voquem algum banco de dados ou servio web. Isso ajuda a manter a compilao da parte de testes executando de maneira rpida e garante a manutenibilidade, evitando a incluso de uma dependncia a um sistema externo que no possvel garantir que no v mudar. razovel executar uma compilao de um projeto que contenha 2000 testes automatizados em 5 segundos; se vrios dos seus testes unitrios envolverem

  • ASP.NET MVC em Ao54

    um banco de dados, a sua compilao provavelmente levar muito mais tempo para finalizar. Outros testes que integrem com elementos externos, como um banco de dados, continuam sendo valiosos, mas, em alguns casos, cada um deles pode levar vrios segundos para ser compilado, ento voc vai querer se concentrar em manter os testes de controladores no nvel da unidade. Para auxiliar nessa tarefa, voc pode simular (mock) as dependncias dos controladores.

    1.6 ResumoVimos como fcil iniciar os trabalhos com o ASP.NET MVC Framework e, daqui por diante no livro, os exemplos no sero to triviais. Agora voc sabe como adicionar uma rota aplicao e sabe que a rota define qual controlador e ao devero ser invocados para um determinado URL. Uma vez que o controlador seja invocado, um mtodo-ao fica encarregado de determinar o que deve ser passado view, baseado na requisio em questo. A view pega os objetos passados a ela e formata-os usan-do um template de view. A view no toma decises sobre os objetos passados, mas apenas formata-os para serem exibidos. Essa separao de interesses contribui para uma aplicao mais manutenvel do que temos visto com o Web Forms.

    Na maior parte do livro, usaremos o CodeCampServer em nossos exemplos. Alm de estar incluso nos downloads deste livro, o CodeCampServer pode ser encontra-do em http://CodeCampServer.org. uma aplicao ASP.NET MVC Framework que pode hospedar uma conferncia de um grupo de usurios. Ela usa uma Arquitetura em Cebola desacoplada, projeto orientado ao domnio, o ASP.NET MVC Framework e o NHibernate para mostrar com o que uma aplicao corporativa de verdade se parece. Possui um processo de construo completo com NAnt, que monitorado por um servidor de compilao como o CruiseControl.Net ou o JetBrains TeamCity. A aplicao como um todo tem o objetivo de ser um exemplo vivo de como se escrever aplicaes de verdade com o ASP.NET MVC Framework. Desde sua concepo, mais voluntrios tm se juntado ao projeto, e agora ele um esforo comunitrio completo. Ele viver muito alm do tempo de vida deste livro, ento a cpia do cdigo que voc est recebendo com este livro uma foto instantnea de um determinado momento do projeto. Convidamos voc a se juntar ao projeto, conforme continua a progredir.

    Usaremos essa aplicao do mundo real em nossos exemplos conforme avanamos. Isso significa que voc deve acompanhar o ritmo com que os conceitos e padres so discutidos. Como uma equipe de autores, decidimos que poderamos fornecer mais valor agregado com exemplos avanados da vida real, para levar o leitor a fazer mais pesquisa do que com exemplos simplificados. Escolhemos no comprometer a questo do design de software, mesmo que isso torne o livro um pouco mais difcil de ser escrito. O primeiro tpico que abordaremos em profundidade, no prximo captulo, a parte de Modelo do padro Modelo-View-Controlador.