Arte Abstrata

Arte Abstrata

Olá pessoal, hoje vou falar de um assunto bem interessante que pode nos ajudar bastante a sermos mais produtivos com nossas aplicações ASP.NET MVC.

Imaginem dois controllers, de Clientes e de Produtos e neles as operações mais básicas de criar um novo objeto de domínio e de editar um objeto de domínio.

Podemos concluir que teremos dois controllers semelhantes aos que estão lá no fim do post.

Vejam lá embaixo…

Viram?!

Certo, agora, não seria melhor se pudessemos ter controllers que tenha todas essas operações de CRUD parecidas com isso:

public class ClientesController : ControllerBase<Cliente, ClienteViewModel>
{
  public ClientesController(IClientes clientes) : base (clientes) { }
}

public class ProdutosController : ControllerBase<Produto, ProdutoViewModel>
{
  public ClientesController(IClientes clientes) : base (clientes) { }
}

Bem melhor não?

Não é de hoje que eu sempre me inspiro nos recursos do Ruby on Rails e tento aplica-los no ASP.NET MVC. E foi inspirado no Inherited Resources (veja mais aqui) que cheguei a uma abstração genérica de controllers de CRUD.

Nesse post vou demonstrar apenas como criar e como editar registros com um controller genérico, mas o mesmo conceito pode ser aplicado também na exclusão ou até mesmo em uma pesquisa simples.

Vamos lá.

Read the rest of this entry

Que sábado incrível!

Logo quando cheguei na porta do teatro da UNIP Tatuapé e vi a mesa cheia de crachás e os congressistas chegando senti que a organização do evento conduziu tudo com grande pofissionalismo. Excelente o trabalho desses profissionais:

As palestras foram ótimas.

O Giovanni Bassi coom sempre defendeu o Domain-Driven Design com muita propriedade, mostrando as grandes vantagens dessa arquitetura. Eu já havia presenciado a palestra dele sobre o mesmo tema nas reuniões do grupo, porém, mesmo assim ele conseguiu passar novas dicas que eu já vou aproveitar no meu trabalho.

A segunda palestra, a do Leandro Daniel, mostrou a todos como um ótimo pattern como a Inversão de Controle pode nos ajudar no nosso trabalho. Me arrisco a dizer que foi o melhor palestrante. Com bastante calma e tranquilidade ele levou sua apresentação a um nível ótimo. Parabéns Leandro!!! Gostei muito da forma que você soube levar a tua palestra.

A palestra sobre ASP.NET MVC, ministrada pelo Victor Cavalcante foi sobre um tema que eu adoro e acompanho muito, um ótimo conteúdo para os presentes. Eu ainda não conhecia o poder do T4 e tudo que ele poderia nos proporcionar. Aos congressistas que ainda não conheciam o ASP.NET MVC, tenho certeza que conheceram uma ótima ferramenta, apresentada com muita segurança pelo Victor.

A palestra do Mauricio Aniche era a que eu mais aguardava. Apesar de testes serem fáceis de se entender, sua aplicação demanda experiência e o Mauricio soube, como grande profissional que é, apresentar de forma bem clara e com um ótimos slides todas as vantagens e todos os tipos de testes. E lembrem-se, “Testem o tempo todo!”. Eu espero testar mais agora.

Além dos palestrantes, não posso deixar de citar o trabalho das pessoas acima. Trabalharam como verdadeiros produtores de eventos e fizeram um trabalho incrível. PARABÉNS! VOCÊS FORAM INCRÍVEIS!

A minha palestra chegou com muita ansiedade. Foi minha primeira palestra e queria uma palestra com bastante conteúdo e informação. Cometi algumas falhas e minha demonstração do NHibernate não foi completada devido a muitas dúvidas dos congressistas. Espero que apesar das pequenas falhas da minha palestra, tenha despertado a curiosidade dos congressistas de conhecer esse grande framewok que é o NHibernate.

Após a minha palestra veio o café. Excelente! Durante o café alguns congressistas vieram até mim com muitas dúvidas ainda sobre o NHibernate. Acho que consegui concluir meu objetivo que era mostrar como um framework de ORM ajuda no nosso trabalho.

Os slides da minha palestra estão no Slideshare e para quem quiser rever eu postei ele aqui também:

O projeto de demonstração você pode baixar clicando aqui.

Junto do projeto está o NHibernate Profiler e o SQLite Database Browser.

Parabéns aos organizadores desse grande evento feito pela comunidade, para a comunidade.

Aos congressistas, espero que tenham gostado da minha palestra e muito obrigado a todos.

Parabéns a todos nós: Organizadores, palestrantes e congressistas!

PS: O Fabio Margarito escreveu um post sobre o evento, vejam clicando aqui. Abaixo o link de algumas fotos postadas por ele:

[]´s

Hoje, lendo alguns posts sobre ASP.NET MVC me deparei anúncios de 4 livros diferentes sobre o framework. Veja a lista de livros (as imagens estão linkadas com os livros na Amazon.com):

Em média, qualquer desses livros acima custa 31 dólares. É ótimo ver que a literatura sobre o framework sendo formada e em alta qualidade. O último livro citado por exemplo, foi escrito pelos membros do time que desenvolveu o framework. Na série “UNLEASHED” temos sempre bons livros. A série “In Action” nunca li, mas o feedback sempre é bom.

Segue ainda uma lista de livros sobre ASP.NET MVC a venda na Amazon.com:

Amazon.com: Livros ASP.NET MVC

Para o próximo post vou listar de livros sobre ASP.NET MVC escritos no nosso idioma.

[]´s

Ainda quando o ASP.NET MVC ainda era um projeto alpha começaram a aparecer os que amaram o framework (eu por exemplo) e os do detestaram. Um dos assuntos era a ausênsia de tagligs, o HtmlHelper e código nativo em meio ao html. E não poderia ser por menos pois muitos gostavam das taglibs pois assim sem o código nativo do meio de seu html deixava (segundo os simpatizantes das taglibs) o código mais limpo. Era um “buzuzu” por causa disso sem limites.

Mas taglibs não deixam de serem helpers não é mesmo?

Bem, no motor padrão de renderização das views do ASP.NET MVC usamos as tags <% %> para inserirmos nossos códigos nativos. Eu não tenho nada contra o código nativo no html, afinal, é apenas lógica de visualização, loops e coisas assim. Porém, para os mais exigentes o ASP.NET MVC traz uma opção para nosso motor de views, o Spark.

Spark é um projeto open-source de um motor de views para tornar nosso código mais amigável. Por exemplo, ao invés de usarmos <% %> nas views usamos ${}. Realmente é mais simpático não é mesmo?

Podemos ver um exemplo com mais recursos do spark no código abaixo:

<viewdata products="IEnumerable[[Product]]"/>
<ul if="products.Any()">
    <li each="var p in products">${p.Name}</li>
</ul>
<else>
    <p>No products available</p>
</else>

Segundo o autor do Spark, a idéia é “deixar o html tomar conta do código e seu fluxo”. E realmente é o que acontece, podemos ver dentro de uma <ul> um if, algumas tags <else>, um each dentro de um <li>.

E como acontece a mágica?

É só você adicionar o SparkViewFactory a sua coleção de ViewEngines (além de é claro, bairxar as assemblies do framework e referenci-alas ao seu projeto ASP.NET MVC). Veja o exemplo abaixo:

protected void Application_Start(object sender, EventArgs e)
{
    ViewEngines.Engines.Add(new SparkViewFactory());
}

Além disso podemos definir algumas configurações para o nosso motor de views como por exemplo, definir algumas namespaces para fazerem referência em todas as nossas views. Veja a definição de algumas configurações no código abaixo:

protected void Application_Start(object sender, EventArgs e)
{
    var settings = new SparkSettings()
        .SetDebug(true)
        .SetPageBaseType("Your.NonDefault.BaseSparkView")
        .AddAssembly("YourAssembly")
        .AddNamespace("System")
        .AddNamespace("System.Collections.Generic")
        .AddNamespace("System.Linq")
        .AddNamespace("System.Web.Mvc");</code>

    ViewEngines.Engines.Add(new SparkViewFactory(settings));
}

Você pode também definir essas configurações no Web.Config.

Temos ainda outros motores como o NHaml, uma implementação do Haml de Ruby para os motores de views do ASP.NET MVC. Esse está disponível como parte do MVC Contrib.

Fica ai mais uma dica para melhorar nosso trabalho no ASP.NET MVC. Agora os “amigos do webforms” não tem mais do que reclamar. ;)

[]´s

Neste post vou descrever um assunto bem legal mas antes, queria deixar um recado aos que acompanham o Programando em .Net por feed. Voltei aos posts e espero que a partir de agora sem essas longas pausas.

Bom, vamos ao que interessa!

Nos últimos meses tenho trabalhado integralmente com ASP.NET 3.5, com o Adobe Flex, com o framework FluorineFx, com NHibernate, com o ASP.NET MVC, com o Unity, enfim… muitas tecnologias e tenho bastante coisa para falar. Posts interessantes estão sendo criados. Aguardem.

E hoje resolvi comentar sobre um post em que conheci um método bem legal de trabalharmos com ModelBinders do ASP.NET MVC.

Um dos patterns que na minha opinião mais combinam com o ASP.NET MVC é o a Inversão de Controle (conhecido também como IoC), mais precisamente o Injeção de Dependências (DI). Esse pattern torna nosso trabalho incrivelmente produtivo, uma aplicação extremamente elegante e uma forma de arquitetura muito funcional. Injetar minhas dependências através de construtores se tornou nas minhas aplicações algo padrão. Porém cheguei em uma sinuca de bico esses dias que me deixou confuso. “Como injetar dependência em nossos modelbinders (custom modelbinder)?”

A mágica veio de um artigo bem simples do Fredrik Kalseth. O artigo é o Constructor Injection for ASP.NET MVC Model Binders.

No caso do artigo do Fredrik Kalseth ele usa como framework de IoC o NInject, eu uso o Unity Application Block mas qualquer framework faz a mesma coisa. Eu já usei também o StructureMap onde comentei neste post, StructureMap – Uma Injeção de Dependências

Vamos imaginar um controller com uma action semelhante a essa:

public class ProdutoController : Controller
{
  [AcceptVerbs(HttpVerbs.Post)]
  public void Novo(Produto produto)
  {

  }
}

Suponha que no formulário para o cadastro de um novo produto seja postado o código da marca desse produto (através de um select). Como carregar a entidade da marca desse produto dentro do meu model binder? Vamos dar uma olhada nas variáveis dessa questãop.

Já vimos que temos uma classe em nosso modelo chamada Produto que em algum momento registramos um model binder que será responsável por fazer de um post transformá-a em uma classe concreta da entidade “Produto”. A primeira questão a se pensar para termos injeção de dependência no model binder é pensar em “quem vai resolver minhas dependências?”.

O Asp.Net MVC tem um “model binder default”. Esse model binder é bem simples e para modelos extremamente simples ele resolve nosso caso, como por exemplo uma entidade que necessite apenas de “Nome” e “Endereço”. Esse “model binder default” resolve esse problema pois é simples. Porém, no nosso caso, precisamos de um “model binder genérico” que resolva qualquer model binder que criarmos que necessite de dependências. Esse mesmo “model binder gernérico” irá receber em seu construtor o container com nossas dependências e ele mesmo irá resolve-las. Veja o exemplo de uma classe GenericBinderResolver, descrito no post do Fred:

public class GenericBinderResolver : DefaultModelBinder
{
  private readonly IUnityContainer _resolver;
  private static readonly Type BinderType = typeof(ModelBinder<>);

  public GenericBinderResolver(IUnityContainer resolver)
  {
    _resolver = resolver;
  }

  public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    Type genericBinderType = BinderType.MakeGenericType(bindingContext.ModelType);
    var binder = _resolver.Resolve(genericBinderType) as IModelBinder;

    if (null != binder) return binder.BindModel(controllerContext, bindingContext);

    return base.BindModel(controllerContext, bindingContext);
  }
}

Vejam que ele herda de DefaultModelBinder, recebe como parametro no construtor um container (no nosso caso um UnityCOntainer) e sobreescreve o método BindModel que é encarregado de resultar no nosso model binder que necessita de uma injeção de dependência no construtor. Quando uma requisição for “postada” para a action “Novo” do nosso constroller “Produto”, esse cara ai em cima que irá ser chamado para achar o model binder que irá bindar o parametro “Produto” dessa action.

Masta sobreescrevermos agora que o model binder padrão da nossa aplicação é GenericModelBinder e passarmos para ele o container do Unity.

ModelBinders.Binders.DefaultBinder = new GenericBinderResolver(_container);

Até aqui tudo bem, mas vemos que no nosso GenericBinderResolver temos um “objeto não identificado”. Quem é aquele “ModelBinder<>”?

Nossos model binders personalizados eram criados como uma implementação de IModelBinder e no método “GetValue”, criávamos nossa lógica onde faziamos do post de um formulário, uma entidade concreta. Como aqui, nosso caso é mais complexo, precisamos de um modelo de model binder que tenha uma “caracteristica” mais particular, por exemplo, a que entidade ele é responsável. Por isso temos ModelBinder<T> descrita abaixo:

public abstract class ModelBinder<T> : IModelBinder
{
  protected abstract T BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext);

  object IModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    return BindModel(controllerContext, bindingContext);
  }
}

Veja que ela tambem herda de IModelBinder, porém ela é uma classe abstrata e com um método que retorna “T”, que é definido em sua declaração. Nossos model binders personalizados agora devem ser herdados dessa classe abstrata ModelBinder<T>. Veja o exemplo abaixo:

public class ProdutoBinder : ModelBinder<Produto>
{
  private readonly IMarcaRepository _marcaRepository;

  public ImovelBinder(IMarcaRepository marcaRepository)
  {
    _marcaRepository = produtoRepository;
  }

  protected override Produto BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
  {
    var post = controllerContext.HttpContext.Request.Form;
    Produto produto = new Produto();

    produto.Marca = _marcaRepository.ObterMarcaPorId(post["Marca"]);

    return produto;
  }
}

Nesse caso, não necessitamos mais registrar o model binder, apenas registramos o GenericBinderResolver que esse se encarrega de resolver todos nossos binders que registramos agora, no container do nosso framework de inversão de controle. Veja bem, você não precisa mais registrar o model binder na classe estática ModelBinders (algo parecido com ModelBinders.Binders[typeof (Produto)] = new ProdutoBinder() ). APenas registramos o typo e sua implementação no container de IoC. Abaixo um exemplo de como eu registro o model binder no container do Unity.

  _container.RegisterType<ModelBinder<Produto>, ProdutoBinder>(new RequestContextLifeTimeManager(typeof(ModelBinder<Produto>)));

Acima fica mais claro o porquê da classe abstrata ModelBinder<T>. É apenas para especificarmos cara binder no container com sua caracteristica particular.

Vemos também que ao registrarmos no Unity o tipo e sua implementação, definimos seu tempo de vida no container com a classe “RequestContextLifeTimeManager” que não existe no Unity. É uma classe onde foi criado um tempo de vida de duração “por requisição”. A ao final de toda requisição, toda instancia existente no container definida com esse tempo de vida, é excluida do container. Mas é assunto para outro post.

Espero que o post seja útil!

[]´s

Ufa! Finalmente!

Foram 5 versões preview, 2 betas e 2 versões release candidate! E hoje, dia 18 de março de 2009 foi o dia que escolheram para o lançamento do

ASP.NET MVC 1.0

Já estou instalando!

Parabéns a toda equipe que trabalhou no projeto, sempre ouvindo os pedidos da comunidade e criando ótimos recursos de desenvolvimento.

[]´s

Saiu mais um, ontem a noite. Divulgado pelo Phil Haack, você pode conferir o post no blog dele clicando aqui.

Algumas mudanças no instalador:

  • A instalação agora requer o .NET 3.5 SP1
  • Você ainda pode distribuir os assemblies na pasta Bin sem o SP1
  • Opção de instalar em “modo servidor”

Desde a versão Beta, como todos sabem, o ASP.NET MVC agora é instalado no GAC.

Algumas mudanças no nessa versão do framework você pode ver clicando aqui. A nova versão está disponível nesse link.

Creio que o próximo anúncio é o lançamento oficial.

O time todo do ASP.NET MVC está de parabéns por esse trabalho, realmente ficou ótimo o framework.

[]´s

, ,

Um recurso bem interessante do ASP.NET MVC são os atributos de Cache, ou OutputCacheAttribute.

E que diabos são esses atributos de cache?

Bem, todo programador (pelo menos os que se preocupam com aquilo que estão desenvolvendo) já passou algumas horas refletindo sobre desempenho e escabilidade de sua aplicação (quem pensa muito nisso são os railers, hehe), e cache entra diretamente nesse assunto. Algumas Views de nossas aplicações, em certas situações não necessitam serem processadas a cada request. Por exemplo, imagine uma loja virtual, os produtos dessa loja certamente não sofrem atualizações constantes, por isso, não há a necessidade de consultar seu banco de dados a cada request.

Em um exemplo bem simples, crie um projeto MVC e um controller qualquer. Crie uma action como o exemplo:

O Atributo [OutputCache] sob a action faz com ela seja cacheada por um periodo, no nosso exemplo, 60 segundos. Para ver funcionando, na View desta action crie uma saída datetime por exemplo e atualize sua view no browser, você vai ver que a view só será atualizada após 60 segundos.

Mas o que acontece por baixo dos panos. O atributo [OutputCache] adiciona algumas instruções ao cabeçalho Http da View.

Sem Cache

Com Cache

A atributo [OutputCache] tem mais parametros, mas é assunto para outro post, mas vale a pesquisa.

[]´s

Scott Hanselman divulgou recentemente o resultado de uma pesquisa bem legal. Ele fez a seguinte pergunta aos visitantes do seu blog: “Quais os recusos do .NET Framework você usa?”.

Dente as 14 opções na pesquisa, que foi respondida por quase 5000 desenvolvedores pelo mundo, estavam as tecnologias mais usadas e suas possívelmente, sucessoras.

O resultado é interessante:

Pesquisa Hanselman

Pesquisa Hanselman

É fácil notar que os desenvolvedores pelo mundo estão ligados nas novidades.

Uma nota interessante é sobre o ASP.NET MVC e o WPF. O WPF é release a um bom tempo, já é uma plataforma bem sólida e cheia de recursos. Já o ASP.NET MVC que ainda é Beta teve a mesma quantidade de votos do WPF.

Se compararmos esses dois com suas tecnologias irmãs, ou seja, WinForms e WebForms notamos que o ASP.NET MVC teve mais interesse por parte dos desenvolvedores WebForms do que o WPF pelos WinForms. Essa visão se explica também pela diferença da curva de aprendizado de WebForms/Mvc e WinForms/WPF.

Notamos também que os Datasets estão ficando cada vez com menos espaço tendo como concorrente forte o Linq To Sql.

Bem legal a pesquisa. Meus votos na pesquisa: WCF, WinForms, MVC, Linq to SQL, EF.

[]´s

, , , ,

Mais uma notícia muito legal de Redmond. Foi dado o primeiro passo para fecharem o pacote e lançarem a primeira versão oficial do ASP.NET MVC. Foi hoje a primeira versão Beta.

As novidades são (links para o site do Scott Gu):

Mais informações no posto do Scott Hanselman

Estava previsto já o lançamento do Beta 1 para a primeira quinzena deste mês e ai está. Basicamente estão fazendo uma “sintonia fina” de tudo que já fizeram e agora falta pouco. O framework está muito legal com recursos que facilitam a vida.

[]’s

, , ,