Pessoal, um monte de gente tem me perguntado como fico sabendo dos exames beta. Eu tinha duas fontes principais, o blog do Gerry O’Brien e o blog da Trika, ambos do time que cuida das certificações Microsoft. Eu leio esses blogs para acompanhar as novidades de certificação, e eles são geralmente bastante relevantes. Quando a informação é de certificação de infra eu pulo, dou uma filtrada. A maior parte é de infra, essa é a verdade, já que há muito mais lançamentos de infra do que de dev. Atualmente estou me interessanto pela certificação de arquitetura, mas vou deixar essa um pouco mais pra frente.

Além dos blogs, o MCP newsletter, que vai para quem já é certificado, também costuma avisar, mas não de todas.

Agora saiu um novo blog, só sobre certificações beta. Acessem o blog Beta Exams Announcements, assinem o rss, e fiquem sabendo antes de todo mundo quando vai ter um exame de certificação beta.

Você também pode assinar este blog, ou visitar de vez em quando a categoria de certificações.

 

Lembrando que certificações beta são gratuitas, e se você passar você fica certificado normalmente, além de receber um belo selo de charter member. Sem dúvida vale a pena.


Postado na(s) categoria(s) Certificação pelo Giovanni Bassi em 13 de agosto de 2008 às 02:05 | Tags: , ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Momento descontração:

cautionary

 

Obrigado pelo link, Linux Hater’s blog.

Nem preciso dizer que já assinei mais um rss… Sou viciado em rss.


Postado na(s) categoria(s) Fun pelo giovanni bassi em 12 de agosto de 2008 às 22:28 | Tags: ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Terminei minha instalação. É bem tranquilo. Já vou avisando, separe pelo menos uma hora e meia, depedendo do seu PC, mais que duas horas. Demora mesmo. Mas vai. O SP1 do Visual Studio 2008, que também não era só uma coleção de correções (trazia novidades como a nova opção de Web Application, em adição ao Web Site), também demorava. Mas esse SP ganhou em espera.

Já o SQL Server 2008 fez o upgrade rápido. Meia hora depois do último clique. Aliás, já testei, e já posso adiantar que o novo SQL Server Management Studio com Intelisense é o máximo. Depois mostro aqui.

Tudo já está rodando diretinho. E você, está esperando o que?


Postado na(s) categoria(s) Visual Studio pelo giovanni bassi em 12 de agosto de 2008 às 00:43 | Tags: , ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Acaba de sair hoje o Service Pack 1 do Framework 3.5, juntamente com o SP1 do VS 2008. Você pode baixá-los aqui e aqui. O SP do Visual Studio também pode ser baixado em formato ISO, o que te permite otimizar o download se você tem um download manager. O ISO está aqui.

Alguns links legais para quem quer saber um pouco mais sobre o release:

  1. Por que o VS 2008 SP1 não se chama VS 2009, no blog da Mary Jo Foley.
  2. Post do Somasegar, que sempre detalha bem o que está saindo de novo.

Com o SP 1 o Visual Studio 2008 passa a suportar também o SQL Server 2008. Eu havia tido problemas ao tentar instalar o SQL Server 2008, porque ele pedia o VS 2008 SP1. Imagino que agora consigo instalar. Cheguei a questionar se o RTM do SQL Server 2008 trabalhava com o Beta do VS 2008 SP1. Na verdade, os releases foram separados somente alguns dias, o que levou a essa confusão.

Já tem também alguns brasileiros falando, como o Renato Guimarães, sempre ligadaço.

O que você ganha de significativo, na minha opinião, com o SP1 para o VS 2008:

  • Melhorias no designer do WPF;
  • Suporte ao SQL Server 2008;
  • ADO.NET Entity Designer;
  • Melhorias no Visual Studio Team System Team Foundation Server (TFS), melhorando o versionamento, performance, integração de e-mail, e suporte ao SQL Server 2008;
  • Mais suporte ao javascript (mais?? inacreditável);
  • Mais AJAX.

E com o SP 1 do .Net Framework:

  • Melhorias de performance entre 20 e 45% para aplicações WPF (sem mecher no código);
  • Mais controle sobre o WCF;
  • ADO.NET Entity Framework;
  • ADO.NET Data Services;
  • Suporte às novidades do SQL Server 2008.

Há suporte ao ASP.Net MVC Preview 3. Será que o P4 funciona? Depois atualizo vocês com o que eu descobrir.

É… e eles lançaram mesmo o Entity Framework do jeito que estava. Mesmo com as criticas fortes da comunidade ao EF, não houveram grandes mudanças. Cheguei até a bater uma bola com o Otavio Pecego Coelho, arquiteto da Microsoft, no blog dele, sobre o EF. Ele ficou de colocar um exemplo mostrando que eu poderia ver as coisas de outra maneira com relação ao EF, estou aguardando.

Concordo com a Mary Jo Foley quando ela sugere chamar o VS 2008 de VS 2009. Mas acho que, na prática, ia ser difícil vender uma versão nova depois de apenas 8 meses, e esse deve ter sido um dos grandes motivos da manutenção do nome e ter feito da atualização um SP. Mas que tem muita novidade para ser um Service Pack, tem. Não é só um monte de correções de bugs, como pode-se notar. Tem um monte de coisa nova. Enfim, os nomes dos softwares relacionados ao .Net continuam confusos.

Meu SP 1 está neste momento em processo de instalação. Fiquem atentos à ferramenta de limpeza do Hotfixes do Visual Studio 2008. Vocês podem precisar dar uma faxinada no seu ambiente antes de instalar o SP 1.

E assim que terminar de instalar, vou terminar minha instalação de SQL Server 2008.

E vou matar uma VM, que agora ficou inútil, já que só servia para os testes do SP 1.

E vocês quando pretendem instalar?


Postado na(s) categoria(s) Visual Studio , .Net Framework pelo giovanni bassi em 11 de agosto de 2008 às 21:14 | Tags: , , , ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Estava olhando os trends do meu Google Reader, que é o leitor de RSS que eu utilizo (e recomendo, é muito bom), e fiquei um pouco assustado:

trends google reader

Eu raramente vou até os blogs diretamente, só acesso via Google Reader, e visito somente para comentar. E o Google Reader é o que eu uso para saber se li ou não, ou seja, é um controle bastante confiável. E o Google Reader Trends é legal porque evidencia meus hábitos de leitura.

O pior é que eu leio tudo isso mesmo. Eu realmente li os 629 posts nos últimos 30 dias, ou que dá uma média de 21 posts por dia.

Não é a toa que tem me faltado tempo (vejam o horário deste post)…


Postado na(s) categoria(s) Blog pelo giovanni bassi em 7 de agosto de 2008 às 02:40 | Tags:

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Essa foi engraçada, para não dizer estranha. Ao tentar instalar o SQL Server 2008 na minha máquina ele disse que precisava instalar o .Net Framework. Eu pensei: “Aham, na minha máquina?”, como se minha máquina já não tivesse todas as versões do .Net Framework existentes. Pois é, não tinha. Ele pede o SP 1 do .Net Framework 3.5, que, até onde eu sei, ainda é beta. Como o SQL Server 2008 é RTM, pensei “Liberaram o SP1”. Engano meu. Mas que ele instalou, instalou. Sei lá que versão é a que está na minha máquina, mas é certo que agora eu tenho na máquina uma versão do SP1. Só não sei se é a final.

Se não for a RTM do SP1, se for o beta, o que vai acontecer com quem lançar o SQL Server 2008 em servidor de produção? Vai jogar bits beta em produção? Ruim, muito ruim. Espero estar enganado.


Postado na(s) categoria(s) SQL Server pelo giovanni bassi em 7 de agosto de 2008 às 01:06 | Tags: ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Estou instalando o recém lançado SQL Server 2008, mas tudo indica que ele vem com alguns probleminhas na instalação.

Se você usa Windows Vista instalado originalmente não em inglês, pode ter problemas na instalação. Na hora de rodas o check de instalação recebe um erro:

Setup Sql Server 2008 - configuration checker com erro

Pois bem, pesquisei em alguns lugares e percebi que o problema rola faz tempo, mas mesmo assim não foi resolvido ainda. Segui o recomendado no fórum, mas não resolveu o problema. A idéia seria pegar o ID da lingua de instalação do seu windows, e adicionar ela no registro.

Para pegar esse ID, seria só rodar:

string.Format("{0,3}", CultureInfo.InstalledUICulture.Parent.LCID.ToString("X")).Replace(" ", "0"); 

Para mim retorna 016.

E adicionar ao registro:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib

Ficaria assim:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\016

Copiando os valores “Counter” e “Help” de alguma outra chave, tipo a 009, para essa nova chave.

Pois bem, fiz isso, não rolou. Estou postando aqui o que fiz para resolver, porque vocês podem ter o mesmo problema.

Por causa da dica no Microsoft Connect colocada por um chinês, fiz um trace do problema à dll Microsoft.SqlServer.Configuration.SetupExtension.dll. O método CheckPerfMonCounter da classe FacetPerfMonCheck, faz uma rotina um pouco diferente da esplicada nos fóruns. Copiei e rodei. Resultado: 0416. Eu já tinha essa chave no meu registro, foi só acrescentar e copiar os valores “Counter” e “Help”:

Registry Editor - após alteração

E funcionou. Sem grandes stress. Mas teve que investigar…

A função para saber o id da sua lingua é a seguinte:

string name = @"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib";
string str2 = null;
int major = Environment.OSVersion.Version.Major;
int lCID = CultureInfo.InstalledUICulture.LCID;
if ((major >= 6) && (((lCID == 0x404) || (lCID == 0x804)) || (lCID == 0x416)))
{
    str2 = string.Format("{0,4}", lCID.ToString("X")).Replace(" ", "0");
}
else if (0x7c04 == CultureInfo.InstalledUICulture.Parent.LCID)
{
    str2 = "004";
}
else
{
    str2 = string.Format("{0,3}", CultureInfo.
           InstalledUICulture.Parent.LCID.ToString("X")).Replace(" ", "0");
}

 

Rode isso, o valor retornar em str2 é a chave que você precisa. Pelo que eu entendi, tem um tratamento especial para o Português brasileiro, que é o 0x416 em Hexa. Se for esse, ele chama a linha 7, senão ele chama a linha 15. O segundo elseif deve ser o do inglês, que retorna 004.

Enfim, espero que ajude quem está no enrosco nessa instalação.


Postado na(s) categoria(s) SQL Server pelo giovanni bassi em 7 de agosto de 2008 às 00:59 | Tags: ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Finalmente saiu o SQL Server 2008. Cheio de novidades, o novo SQL Server veio para consolidar um ótimo trabalho já feito no SQL Server 2005. Vêm novidades aí com a possibilidade de usar Hyper-V (a ser lançado em breve ao que tudo indica), suporte a dados espaciais e de localização, suporte a mais dados no Analysis Services, etc, etc, etc…

A Mary Jo Foley, da ZDNet, comenta as features um pouco mais aprofundadamente.

Se você ainda não viu o suporte a dados espaciais, sugiro dar uma olhada. As demos que já vi são sempre de cair o queixo, mostrando a distância entre as pessoas, localizando-as no mapa com Live maps, traçando rotas, enfim, o negócio é poderoso.

Hoje à noite ponho a mão nele. Vamos ver…


Postado na(s) categoria(s) SQL Server pelo giovanni bassi em 6 de agosto de 2008 às 17:28 | Tags:

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Postado na(s) categoria(s) ASP.Net MVC pelo Giovanni Bassi em 26 de julho de 2008 às 20:50 | Tags: , , ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

 

chaveautautmvc Dei uma boa olhada na nova funcionalidade de autenticação e autorização para o ASP.Net MVC, e posso dizer que ficou bem legal. Gostei do que vi, ficou simples e fácil de aplicar. Assim como todas essas novas funcionalidades, esta está vindo também através de um Interception Filter. Basicamente o que o filtro faz é verificar se você está autenticado, e opcionalmente, autorizado a acessar uma determinada ação ou controller.

O atributo é o AuthorizeAttribute, e você pode ver o que ele está fazendo no repositório do fonte no Codeplex. Note que, basicamente, ele está verificando se o usuário está autenticado, olhando para a user.Identity.IsAuthenticated:

IPrincipal user = filterContext.HttpContext.User;
if (!user.Identity.IsAuthenticated) {
filterContext.Cancel = true;
filterContext.Result = new HttpUnauthorizedResult();
return;

 

Nada de mais, certo? Para autorizar é mais ou menos a mesma coisa, ele pega a lista de usuários ou papéis (roles) e verifica:

if (!String.IsNullOrEmpty(Users)) {
IEnumerable<string> validNames = SplitString(Users);
bool wasMatch = validNames.Any(name => String.Equals(name, user.Identity.Name, StringComparison.OrdinalIgnoreCase));
if (!wasMatch) {
filterContext.Cancel = true;
filterContext.Result = new HttpUnauthorizedResult();
return;
}
}
if (!String.IsNullOrEmpty(Roles)) {
IEnumerable<string> validRoles = SplitString(Roles);
bool wasMatch = validRoles.Any(role => user.IsInRole(role));
if (!wasMatch) {
filterContext.Cancel = true;
filterContext.Result = new HttpUnauthorizedResult();
}
}

Além deste atributo, que faz o trabalho pesado de autenticação e autorização, há um controller para auxiliar no contato com o aplicativo em si. Ele se chama AccountController, e já vem no projeto. Há também algumas views que esse controle utiliza. Dêem uma olhada no Solution Explorer, com os itens novos destacados:

solexplautenautormvc

Já o controller em si traz os seguintes métodos:

class view - account controller

Como podemos ver, ele tem ações para trocar senha, logar, deslogar, e criar um novo usuário (register). Ele não lista usuários, cria grupos e outras tarefas administrativas. Pelo que eu li nos blogs da Microsoft, eles esperam que tarefas administrativas sejam feitas de outra forma, e sugerem que no IIS 7 isso já é mais fácil. Isso pode querer dizer que não vai rolar um sistema de gestão de usuários no MVC. Para compensar isso há a boa notícia de que eles vão evoluir um pouco mais esse controlador e as views, permitindo trocar os mecanismos de autenticação e autorização, se não quisermos usar o membership do ASP.Net, que é onde o atributo [Authorize] e o controlador estão acoplados atualmente. Será possível estender este modelo de 2 formas então:

  1. Trocando o membership do ASP.Net por algum outro framework;
  2. Trocando o provider de membership do ASP.Net. Para permitir isso, o construtor do controlador já inicia com uma injeção de dependência bonita, dêem uma olhada:

   16 public AccountController()

   17     : this(null, null)

   18 {

   19 }

   20 

   21 public AccountController(IFormsAuthentication formsAuth, MembershipProvider provider)

   22 {

   23     FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

   24     Provider = provider ?? Membership.Provider;

   25 }

Essa interface, IFormsAuthentication, é nova, e é parte do MVC. O MembershipProvider é o velho conhecido MembershipProvider do ASP.Net. Dessa forma, fica fácil injetar um outro provider, para testar, e até mesmo trocá-lo. Para arrancar de vez o Membership do ASP.Net (primeira opção acima), a recomendação até agora é refazer o controlador. Mas isso vai melhorar.

Vimos que há view para trocar senha, para fazer login e se cadastrar. Como fica? Vou mostrar um screenshots abaixo, mas antes fiz um controlador simples, onde um usuário normal só pode ver uma lista de categorias, e o usuário admin pode alterar. Vejam o controlador:

    1 public class CategoriaController : Controller

    2 {

    3     [Authorize(Roles="All,Admin")]

    4     public ActionResult Index()

    5     {

    6         return View("Index", (new Northwind2005Model.NorthwindEntities()).

    7             Categories.ToList());

    8     }

    9 

   10     [Authorize(Roles = "Admin")]

   11     public ActionResult Edit(int id)

   12     {

   13         var northwind = new Northwind2005Model.NorthwindEntities();

   14         var categoria = (from cat in northwind.Categories

   15                         where cat.CategoryID == id

   16                         select cat).First();

   17         return View(categoria);

   18     }

   19 

   20     [Authorize(Roles = "Admin")]

   21     public ActionResult Update(int id)

   22     {

   23         var northwind = new Northwind2005Model.NorthwindEntities();

   24         var categoria = (from cat in northwind.Categories

   25                         where cat.CategoryID == id

   26                         select cat).First();

   27         BindingHelperExtensions.UpdateFrom(categoria, Request.Form);

   28         northwind.SaveChanges();

   29 

   30         return Index();

   31     }

   32 }

Naturalmente a ação index, que é a padrão, lista os usuários, mas antes eu preciso estar autenticado. Então, quando eu clico na aba de categorias, sou direcionado à view de login pelo controlador:

Formulário de login do ASP.Net MVC

Após autenticar, por algum motivo, ele me redireciona de volta à Home (porque será?). Tenho que clicar novamente na aba de categorias que criei para finalmente ver as categorias, exibida pela ação index (notem o login aparecendo em destaque):

Exibição das categorias, com destaque no usuário autenticado (usuário comum)

Mas eu loguei com um usuário comum. Ao tentar editar, sou direcionado ao login de novo, como se fosse para logar como admin. Logo como admin, ele volta à Home de novo (!?), navego até as categorias e tento editar. Agora já consigo editar e salvar. Essa é ação Edit, note mais uma vez o login no canto superior direito. Agora é o usuário admin:

Edição das categorias, com destaque no usuário autenticado (usuário admin)

Não gostei dessa história. Porque não posso ser direcionado de volta à mesma página, para exibir uma mensagem? Busquei uma forma simples. Ainda não há.

É possível ainda incluir um novo usuário via link de Register, ação também chamada Register (pode ser visto na primeira imagem do IE acima):

Formulário de criação de contas do MVC

E trocar de senha:

Formulário de troca de senha do MVC

Uma das coisas que achei mais interessantes está na ação de login: ela posta para si mesma, e dessa forma controla exibição de erros, como senha muito curta. Muito inteligente.

Conclusão dessa verificação do código de autorização e autenticação: com esse exemplo já dá para confirmar que o negócio funciona direitinho, mas precisa ainda evoluir um pouco em usabilidade e extensibilidade. Vamos aguardar agora o Preview 5, que deve sair daqui uns 2 meses.


Postado na(s) categoria(s) ASP.Net MVC pelo Giovanni Bassi em 26 de julho de 2008 às 20:47 | Tags:

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Sou certificado MCTS 3.5

Acabo de receber a confirmação de que passei no exame 70-561, para ADO.Net 3.5. Essa prova, que ainda nem foi lançada (vai sair mês que vem), é para quem vai se certificar MCTS. Já cai inclusive o Entity Framework, que vai sair com o SP 1 do Visual Studio/.Net Framework 3.5, e que também ainda não foi lançado.

Eu fiz a prova antes de ser lançada porque tive acesso ao programa beto, que na verdade era aberto. As provas beta são grátis, e chamei meus amigos e os leitores deste blog a participarem da prova. Valia a pena por vários motivos: para conhecer o que cai, testar conhecimento, e, se passassem, ficariam com a certificação.

Pois é, passei. Mais uma para a carteirinha. Estou esperando sair os exames de upgrade de MCPD 2.0 para MCPD 3.5, que pelo visto ainda vai demorar, já que eles nem lançaram os betas, e eu estou de olho. Não vou fazer um milhão de exames e me certificar do zero de novo… quero o upgrade.

E vocês, fizeram a prova? Como foram?


Postado na(s) categoria(s) Certificação pelo giovanni bassi em 25 de julho de 2008 às 02:56 | Tags: , , ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

.Net Magazine edição 53

Se você se preocupa com qualidade para desenvolvimento de software, sugiro que você leia também meu outro artigo da edição deste mês na .Net Magazine (edição 53), que fala sobre testes unitários utilizando mocks e stubs.

Li a algum tempo em algum blog uma definição de legado. Pelo que eu me lembro:

1) Se você não documentou, é legado.
2) Se você não criou testes unitários, é legado.
3) Se outra pessoa não consegue ler o código, ou ele parece uma macarronada, de tão embarassado, é legado.

Não interessa se você escreveu o código hoje de manhã. Se você não criou testes unitários ele é automaticamente código legado. Então, para ajudar a diminuir a quantidade de código legado no mundo, eu quis escrever este artigo, e os próximos que virão (é uma pequena série, a terceira vai ser focada em testes com ASP.Net MVC). Ele vai te mostrar como escrever testes verdadeiramente unitários, vai diferenciar testes unitários de testes integrados, e vai te ensinar a criar uma aplicação mais testável, ou seja, que te permite testar, por exemplo, um componente de acesso a dados, sem a base de dados.

Garanto que, se você passar a testar seu código, a criar um teste unitário logo após criar uma função de negócio, a qualidade do que você desenvolve vai melhorar muito. E se você já testa, mas não conhece os objetos de mock, vai ganhar muito, porque a idéia do mocking como um todo é sensacional.

Me digam o que acharam. Vão passar a testar? Vale a pena?


Postado na(s) categoria(s) Artigos técnicos pelo giovanni bassi em 24 de julho de 2008 às 19:58 | Tags: , , , , ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
.Net Magazine edição 53

Saiu a .Net 53 da .Net Magazine. Nesta edição estou falando de um tema muito legal: Lambas e Generics com C# 3.0.

Muita gente não conhece o poder adicionado à linguagem com as Lambdas. Já tínhamos os generics antes, o que dava bastante poder, e agora com as Lambdas, a linguagem ficou ainda mais elegante. Sugiro que, se você gosta de conhecer novas maneiras de programar, que dê uma olhada. Com as Lambdas, o C# ficou com uma carinha de linguagem funcional, meio parecido com o F#.

Dêem uma olhada nessa construção com Lambdas, impossível no C# 2.0:

Action<Action<string>, string> DeixaMaiusculaEProcessa = (acao, texto) => acao(texto.ToUpper());
DeixaMaiusculaEProcessa((texto) => Console.WriteLine(texto) , "algum texto maiusculo");

Eu gosto muito, passa uma idéia de ação, mesmo. Sem dúvida é uma adição boa.

Me contem o que acharam por aqui.


Postado na(s) categoria(s) Artigos técnicos pelo giovanni bassi em 24 de julho de 2008 às 19:41 | Tags: , , , , ,

5.0 ponto(s). Avaliado por 1 pessoas

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Acabo de assistir uma conversa com Juval Lowy, que é autor do livro “Programming WCF Services” (o livro de WCF do “peixinho”, mas informações aqui), gravada durante o TechEd americano deste ano, onde ele fala de Interface Based Design. Ele explica algo que muitos ainda não entram ainda em contato: desenvolvimento baseado em abstrações, e porque isso é bom. Ele bate forte no desenvolvimento baseado em classes concretas ou até em classes abstratas, e defende que o uso de interfaces para classes de negócio deve ser generalizado. O vídeo é em inglês, sem legendas. Recomendo assistir.

Isso é um conceito com o qual concordo, mas que acho que deve ser utilizado com cuidado, e não em todo lugar. Bem utilizado é poderosíssimo, e realmente, foram poucas as vezes que o vi utilizado, e das vezes que vi, não foram todos os usos bem direcionados. Um bom uso de interfaces facilita nos testes, desacopla o design, e deixa a aplicação como um todo mais flexível.

E você, tem usado Interfaces no seu dia a dia? O que acha disso?


Postado na(s) categoria(s) Arquitetura , Indicação de conteúdo pelo giovanni bassi em 24 de julho de 2008 às 14:19 | Tags: ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Mais uma olhada no recém lançado Preview 4 do ASP.Net MVC. Se você chegou aqui agora, vale a pena dar uma olhada nos outros posts. Nesse vou dar uma olhada no tratamento de erros, que é feito com um Filter Interceptor. Eu já havia visto o cache com Filter Interceptor, e a implementação do tratamento de erro é também muito simples, seguindo o mesmo modelo de atributos em funções. É mais simples, inclusive, do que era antes com Web Forms. E é bem configurável.

Fiz 2 ações no controlador “Quebrado”: ação Index, que é a padrão (não precisa especificar), não trata o erro, e ação “tratada”, que trata o erro.

Antes, quando você tinha um erro, você recebia a seguinte tela de erro, se tivesse os custom errors desligados (ação Index):

Erro Padrão do ASP.Net com ASP.Net MVC- CustomErrors Off

Se custom errors estiver ligado, a mensagem é a seguinte (ação Index):

Erro Padrão do ASP.Net com ASP.Net MVC- CustomErrors On

Até aí, essa é a resposta padrão do ASP.Net, todos conhecemos a velha tela amarelona (e não gostamos de vê-la, não é verdade?). O ASP.Net MVC traz agora uma novidade: pode-se tratar erros com um simples Interceptor Filter, que é aplicado com um atributo no método (ação do MVC) ou na classe (controlador).

Se a exibição dos erros erros estiver habilitada (custom errors off), e uma ação tiver um erro, a view de erros será exibida, conforme a figura abaixo (note que essa é a ação “tratada”):

Nova View de erros - CustomErrors Off

E se estiver desabilitada (custom errors on), será exibida uma mensagem mais simples, sem o detalhamento do problema (o que é prática comum de segurança) – exibindo ação “tratada”:

Nova View de erros - CustomErrors On

Já se você quiser fazer um tratamento customizado do erro, você pode. Abaixo fiz uma view padrão para mostrar erros de overflow (mais uma vez, ação “tratada”:

View de erros Customizada

Como funciona? Muito simples. Vejam abaixo o código do controller:

    9 public class QuebradoController : Controller

   10 {

   11     public ActionResult Index()

   12     {

   13         return JogaErro();      

   14     }

   15 

   16     [HandleError(ExceptionType = typeof(OverflowException), View = "OverflowException")]

   17     [HandleError()]

   18     public ActionResult Tratada()

   19     {

   20         return JogaErro();

   21     }

   22 

   23 

   24     public ActionResult JogaErro()

   25     {

   26         if (Session["aleatorio"] == null)

   27             Session["aleatorio"] = 0;

   28         var aleatorio = (int)Session["aleatorio"];

   29         aleatorio++;

   30         if (aleatorio > 1)

   31             aleatorio = 0;

   32         Session["aleatorio"] = aleatorio;

   33 

   34         switch (aleatorio)

   35         {

   36             case 0:

   37                 throw new OverflowException("Essa é uma OverflowException.");

   38             default:

   39                 throw new ApplicationException("Essa é uma ApplicationException.");

   40         }

   41     }   

   42 }

A acão “tratada” tem 2 atributos chamados HandleError, que são os atributos que fazem o tratamento. O primeiro informa que trata exceções de overflow, e especifica a View, através de parâmetros, ficando a View de nome “OverflowException” responsável por esses erros. O segundo trata todas as outras exceções, e utiliza a View padrão, que é chamada Errors.aspx, e fica no diretório /Views/Shared. Vejam o Solution Explorer:

Solution explorer

Vejam o código da View:

    7 namespace MvcApplicationErrorHandler1.Views.Shared

    8 {

    9     public partial class Error : ViewPage<HandleErrorInfo>

   10     {

   11     }

   12 }

Ela utiliza como modelo um objeto HandleErrorInfo, que é o seguinte:

    1 namespace System.Web.Mvc

    2 {

    3     public class HandleErrorInfo

    4     {

    5         public HandleErrorInfo(Exception exception, string controller, string action);

    6 

    7         public string Action { get; }

    8         public string Controller { get; }

    9         public Exception Exception { get; }

   10     }

   11 }

Esse objeto tem propriedades para a ação, para o controlador, e para a exceção lançada. Minha customizada utiliza esses dados:

    1 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"

    2 AutoEventWireup="true" CodeBehind="OverflowException.aspx.cs"

    3 Inherits="MvcApplicationErrorHandler1.Views.Quebrado.OverflowException" %>

    4 <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">

    5     <h2>Você teve uma OverflowException</h2>

    6     <b>Dados:</b><br />

    7     <b>Action:</b>              <% =this.ViewData.Model.Action %><br />

    8     <b>Controller:</b>          <% =this.ViewData.Model.Controller %><br />

    9     <b>Mensagem da exceção:</b> <% =this.ViewData.Model.Exception.Message %><br />

   10 </asp:Content>

E o resultado é a imagem lá em cima.

Achei o resultado muito bom. Dá para tratar erros muito bem. Diferente do AJAX com MVC, já é uma função bem completa. Já imagino uma classe que herde de ViewPage Controller tipo uma ErrorHandlerViewPage ControlleBase, sendo colocada como classe de base, e podendo até já realizar o tratamento de erro. Para o log do erro, imagino que seria com a criação de outro filter interceptor. Vou pensar nisso depois coloco aqui. Alguma sugestão pessoal?


Postado na(s) categoria(s) ASP.Net MVC pelo giovanni bassi em 23 de julho de 2008 às 21:00 | Tags: , ,

Ninguém avaliou. Dê sua nota!

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Gerencio uma fábrica de software, gosto muito de arquitetura e engenharia de software, publico artigos e edito a .Net Magazine. Dou umas palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Selos

Web Days 2008

MCPD

MCSD

.Net Magazine

Categorias