web 2.0

Roadshow: A Microsoft passa pela sua cidade!

O Roadshow é um evento presencial diferenciado, onde durante um dia inteiro serão apresentadas sessões técnicas com demonstrações ao vivo, utilizando um ambiente com os últimos lançamentos da Microsoft. Há apenas uma breve introdução teórica, para entendimento do cenário e depois, o time de Especialistas da Microsoft apresenta ao vivo, na prática, toda a solução sendo implementada passo a passo. Neste evento será apresentado um caso fictício de uma empresa que possui vários desafios de TI (desenvolvimento de software e infraestrutura de TI), e como os novos produtos e tecnologias da Microsoft podem torná-la mais competitiva, com gerenciamento, segurança, escalabilidade e performance. ASP.NET MVC e Web forms, HTML 5, IE9, Silverlight, Windows Phone 7, SharePoint e desenvolvimento para Windows, sendo tudo integrado com Windows Azure, são os principais temas a serem tratados durante as apresentações. Soluções de arquitetura, web services e Azure serão explorados também, pois o futuro é a nuvem e suas aplicações precisam estar prontas para essa nova geração de soluções baseadas em cloud computing. Ao termino do evento você aprenderá como tirar melhor proveito de tais tecnologias, tornando-se um profissional com diferencial competitivo. Clique, inscreva-se e participe do Road Show 2011!

Belo Horizonte - 31/03
Hotel Mercure Lourdes
Inscrições disponíveis:
Profissionais de TI
Desenvolvedores

Tags:

Asp .Net | Desenvolvimento

Programa Students to Business (S2B) - Novos Cursos

A PUC Minas e o Centro de Inovação Microsoft oferecem a partir de setembro o programa Students to Business (S2B), voltado para estudantes de ensino médio e superior.

O Students to Business é uma iniciativa da Microsoft, dos Parceiros da Microsoft e as principais universidades do país com o objetivo de capacitar estudantes nas áreas de Tecnologia da Informação (TI), e oferecer visibilidade e oportunidades de emprego.

O programa (S2B) tem por objetivo aproximar estudantes de oportunidades de trabalho nas carreiras de Tecnologia de Informação. Neste semestre serão oferecidos cursos, nas áreas de Infraestrutura de Sharepoint (novidade desta edição), Banco de Dados com ênfase em Business Intelligence e Desenvolvimento de Sistemas.

A capacitação é dividida em 3 fases, possibilitado aos estudantes a oportunidade de  adquirirem formação técnica para tornarem-se profissionais júnior em TI. Na primeira fase o curso traz informações sobre as carreiras de TI, na segunda, aulas teóricas e na terceira, aulas práticas, com o desenvolvimento de um projeto tecnológico. No encerramento são entregues certificados, em um evento que inclui uma feira de empregos.

Para participar do programa Students to Business acesse o site www.programas2b.com.br e faça sua inscrição até o dia 19/09!

Local do Students to Business:

As capacitações acontecem na unidade São Gabriel da PUC Minas (Rua Walter Ianni, 255 – bairro São Gabriel), onde está instalado o Centro de Inovação Microsoft – MIC BH. O núcleo é uma parceria entre a PUC Minas, a Microsoft e a empresa de tecnologia da informação BHS e tem o objetivo de fomentar o uso de tecnologias de ponta pelas empresas da região e oferecer capacitação profissional, além de estimular a indústria local de software.  Informações: (31) 3439.5217.

Centro de Inovação Microsoft de Belo Horizonte (MIC BH)

Microsoft Innovation Center - Belo Horizonte – MG

PUC Minas - São Gabriel

Tel.:(31) 3439-5217

Site: http://www.micbh.com.br

Tags:

C# | Asp .Net | Desenvolvimento Web

Asp .Net MVC 3–Preview 1

Fala galera tudo tranks?

Antes de darmos continuidade aos posts sobre WCF, gostaria de apresentar a vocês o mais novo preview do Asp Net MVC 3.

Para que vocês possam acompanhar o post da melhor forma possível, abaixo segue o link para download do primeiro preview, clique aqui.

O Asp .NET MVC 3 será compatível com a sua versão anterior, o Asp .NET MVC 2, contudo, isso não significa que será fácil atualizar os projetos que você está escrevendo com o MVC 2 para o MVC 3 quando eles lançarem a versão final.

As funcionalidades do Asp .Net MVC 3 tem como base as funcionalidades do Asp .Net MVC 1 e 2, ou seja, todo seu conhecimento adquirido em sites e livros não serão perdidos, isso porque, as funcionalidades do Asp .Net MVC 1 e 2 não se tornaram obsoletas.

Ok Luciano, mas a pergunta de todos é: “Posso instalar o Asp .Net MVC 3 junto com o ASP.NET MVC 2?”, a resposta é sim, você pode, inclusive a versão preview, sem que esta impacte projetos existentes da versão do Asp .Net MVC 2 que você esteja trabalhando, eles continuarão a usar o Asp .Net MVC 2 a menos que você modifique os projetos para que estes passem a usar o Asp .Net MVC 3.

Quando você instalar a versão "Preview 1", você terá um novo conjunto de templates de projeto para o Asp.Net MVC 3 que aparecerão na janela de diálogo de Novo Projeto do Visual Studio 2010.

Vamos ver algumas das novas funcionalidades e capacidades do Asp .Net MVC 3. Ressalvo que tudo que fizermos aqui são funcionalidades da versão 3 do Asp Net MVC, isso não quer dizer que novas funcionalidades não possam sair em versões futuras.

View

O Asp.Net MVC 3 "Preview 1" inclui um conjunto de melhorias específicas para a View.

Janela de Diálogo
Foi criada uma nova janela de diálogo "Add->View", que torna mais fácil sua escolha quanto a sintaxe a ser utilizada. Ela permite que você selecione qualquer um dos motores de exibição disponíveis que estejam instalados na sua máquina, o que lhe dá a habilidade de usar qualquer abordagem de modelagem de visão que pareça mais natural para você.

mvc3_01
Figura 01 – Nova janela Add View

Nova Engine Razor
Não irei entrar em detalhes sobre a Engine Razor, isso porque daria outro post, então, sugiro que vocês deem uma lida no post do Scott Guthrie sobre o Razor

 

Controller

Assim como para a View, o Controller também ganhou algumas novidades:

Filtros Globais
O Asp.Net MVC 3 suporta a capacidade de aplicar de forma declarativa lógica "contínua" usando um mecanismo chamado de "filtros". Você pode especificar filtros nos controladores e métodos de ação hoje usando uma sintaxe de atributo conforma a listagem 1.

Listagem 01 – Filtros

[HandleError]
[LoaderOptimization(128)]
public ActionResult Index()
{
    ViewModel.Message = "Aplicação Asp.Net MVC 3";

    return View();
}

Muitas das vezes precisamos aplicar filtros a todos os controladores de uma aplicação, com o Asp .Net MVC 3, foi adicionado um método chamado RegisterGlobalFilters que irá adicionar os filtros à coleção GlobalFilters. Basta fazer a chamada no Application_Start() do seu Global.asax.

Listagem 02 – Filtros Globais

public static void RegisterGlobalFilters( GlobalFilterCollection filters )
{
    filters.Add( new HandleErrorAttribute() );
}

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters( GlobalFilters.Filters );
    RegisterRoutes( RouteTable.Routes );
}

O Asp .Net MVC 3 é flexível no que diz respeito a filtros, de modo que você pode configurar um filtro global que será aplicado condicionalmente apenas se forem respeitadas determinadas condições. Por exemplo, se a depuração estiver habilitada; se uma requisição usar um verbo http dentre outras. Os filtros também podem ser resolvidos a partir de um Conteiner.

ViewModel Dinâmico
Os Controladores do Asp.Net MVC suportam uma propriedade "ViewData" que permite a você transmitir dados para uma View usando uma coleção (Dictionary) como na listagem 03.

Listagem 03

ViewModel["Message"] = "Aplicação Asp.Net MVC 3";

Já na versão 3 do MVC, foi adotada a propriedade dinâmica, dynamic, ela permite que você use o novo
suporte à linguagem dinâmica tanto do VB quanto do C# para passar itens da ViewData usando uma sintaxe um pouco mais limpa do que aquela utilizada com a API de dicionário atual. Observe a figura 2, a propriedade Message só será conhecida em tempo de execução.

mvc3_02

Figura 02 – Dinamismo

 

ActionResult
As novidades não param por ai! O Action Result também ganhou novas funcionalidades:

HttpNotFoundResult

A nova classe HttpNotFoundResult é usada para indicar que um recurso solicitado pela URL atual não foi encontrado. Ela retorna um código de status HTTP 404 para o cliente que realizou a chamada. Opcionalmente, você pode usar o novo método de ajuda HttpNotFound() no controlador para retornar uma instância desse tipo de resultado de ação, conforme a listagem 4.

Listagem 04

public ActionResult RecuperaProduto(int codProduto)
{
    var prod = new Produto.Find(codProduto);

    if ( prod == null )
        return HttpNotFound();

    return View();
}

Redirecionamentos Permanentes

A classe HttpRedirectResult tem uma nova propriedade "Permanent" do tipo booleano que é usada para indicar se um redirecionamento permanente deve ocorrer. Um redirecionamento permanente usa o código de status HTTP 301. Em conjunto com esta mudança, a classe Controller tem agora três novos métodos para realizar redirecionamentos permanentes: RedirectPermanent(), RedirectToRoutePermanent(), e RedirectToActionPermanent().

Esses métodos retornam uma instância do tipo HttpRedirectResult com a propriedade Permanent definida com true.

HttpStatusCodeResult

A nova classe HttpStatusCodeResult pode ser usada para definir um código de status e descrição de resposta de forma explícita.

 

Ajax e Javascript
Dando continuidade às novidades, o Asp.Net MVC 3 inclui suporte para JSON, o que permite que os métodos recebam dados codificados no formato JSON podendo assim, vinculá-los como parâmetros dos métodos.

Observe o código da listagem 5, ele define um manipulador de eventos "save" que será chamado quando um botão salvar for clicado no lado cliente. O código dentro do manipulador de eventos irá criar um objeto "produto" no código JavaScript com dois campos, cujos valores são obtidos a partir de elementos de entrada HTML. Em seguida, ele usa o método .ajax() da jQuery para postar (POST) uma requisição baseada em JSON que contém o produto para uma URL /Store/UpdateProduct no servidor.

Listagem 05 – método Ajax

$("#save").click(function () {
    var prod = {
        NomeProduto: $("#ProdName").val(),
        Valor: $("#value").val()
    };

    $.ajax({
        url: "/Store/UpdateProduct",
        type: "Post",
        data: JSON.stringify(prod),
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        sucess: function () { $("message").html("Produto atualizado").fadeIn() },
        error: function () { $("message").html("Erro ao atualizar o Produto").fadeIn() }
    });

    return false;
});

No lado servidor você terá algo como na listagem 6.

Listagem 06 – Atualizar Produto

public ActionResult UpdateProduct(Produto produto)
{
    //Implementar a lógica para atualização de um produto
    return null;
}

 

Validação do Modelo

No Asp.Net MVC 2, houveram algumas melhorias no que diz respeito à validação, no Asp .Net MVC 3,  este trabalho foi estendido e ainda por cima eles adicionaram suporte para vários outros novos recursos de validação e os introduziram no namespace System.ComponentModel.DataAnnotations do .NET 4.  São eles:

  • Suporte aos novos atributos de metadados – DataAnnotations, tais como DisplayAttribute.
  • Suporta as melhorias feitas na classe ValidationAttribute no .NET 4. A classe ValidationAttribute foi melhorada no .NET 4 para suportar uma sobrecarga nova IsValid que fornece mais informações sobre o contexto de validação corrente, permitindo saber por exemplo qual é o objeto que está sendo validado. Isso permite cenários mais ricos, onde você pode validar o valor atual baseando-se em outra propriedade do modelo.
  • Suporta à nova interface IValidatableObject introduzida no .NET 4. A interface IValidatableObject permite a execução de validação no nível do modelo, e permite que você forneça mensagens de erro de validação específicas para o estado geral do modelo, ou entre duas propriedades do modelo.

Na listagem 7, podemos ver como utilizar a a interface IValidatableObject nativa no .NET 4 para implementar um método de validação personalizado em uma classe.

Listagem 07 – Implementando IValidatableObject

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    if ( string.IsNullOrEmpty( NomeProduto ) )
        return (IEnumerable<ValidationResult>) new ValidationResult("Você deve preencher o campo Nome do Produto");
    return null;
}

Além da interface IValidatableObject, o Asp.Net MVC 3 também apresenta uma nova interface chamada IClientValidatable que permite descobrir em tempo de execução se um validador tem suporte para a validação no lado do cliente. Esta interface foi projetada de modo que possa ser integrada com uma variedade de frameworks de validação.

 

Dependency Injection

O Asp.Net MVC 3 nos dá um melhor suporte para aplicação de injeção de dependência (DI) e integração com Conteiners de injeção de dependência.

Para a versão "Preview 1", foram adicionados suporte para injeção de dependência nos seguintes locais:

  • Controladores (registro e injeção de fábricas de controladores, injeção de controladores)
  • Visões (registro e injeção de motores de visão, injeção de dependências em páginas de visão)
  • Filtros de Ação (localização e injeção de filtros)

Para futuras versões, poderão ser acrescentados os seguintes suporte para injeção de dependência em:

  • Model Binders - Vinculadores de Modelo (registro & injeção)
  • Value Providers - Provedores de Valor (registro & injeção)
  • Validation Providers - Provedores de Validação (registro & injeção)
  • Model metadata Providers - Provedores de Metadados de Modelo (registro & injeção)

Ufa, finalmente terminei, acho que vocês não viam a hora né!!

Como podem ver, as melhorias são muitas, isso na versão Preview 1 heim!! Imagina o que vem por ai. Espero poder postar a vocês tudo que for novidades no Asp .Net MVC 3.

É isso ai galera, até o próximo post!

 

Enjoy!

Tags:

Asp .Net | MVC 3 | C#

De volta aos posts

Fala galera, desculpem por ter deixado de postar mas estas três ultimas semanas foram cruciais para que eu ficasse por conta de estudar e tirar mais algumas certificações e graças a Deus deu tudo certo.

Recebi o resultado das duas provas Betas do .NET 4.0 que fiz

TS: Web Applicaions Development w/Microsoft .NET Frmwk 4 – Failed
Pro: Designing & Developing Web Apps Using MS .NET Frmwk 4 – Passed

 

Já para a certificação MCPD Enterprise Application Developer 3.5 na qual passei as semanas estudando a coisa foi bem melhor, como faltavam apenas mais três provas resolvi fazer todas de uma vez, não foi fácil, mas também não foi impossível e ta ai o resultado, até fiquei surpreso com a pontuação alcançada nas provas mas isso prova que estudando a gente consegue!

PRO: Design & Develop Enterprise App Using MS .NET Frmwrk 3.5 – Passed - 916pts
TS: MS .NET Framework 3.5, ADO.NET Application Development – Passed - 895pts
TS: MS .NET Framework 3.5, Windows Forms App Dev – Passed  1000pts

Bem para aqueles que estão interessados em tirar uma certificação seja 3.5 ou 4.0 a dica é estude muito, faça bastante exercício e principalmente faça os simulados que vem junto aos livros pois eles ajudam bastante e principalmente eles contêm explanação sobre o porquê da resposta dada que é muito válido.

A meta agora é MCITP: Database Developer 2008, já tenho material de estudos o que falta é coragem pra começar..hehehehe, mas vamos em frente.

É isso ai pessoal, obrigado àqueles que acompanham o blog, fico feliz que estejam gostando e caso tenham dúvidas não hesitem em perguntar estou sempre à disposição!

Tags:

Asp .Net | Desenvolvimento Web | JavaScript | WCF

WCF Data Service

Antes de iniciarmos com WCF Data Service vamos dar uma passada rápida no conceito de Web Service e WCF para que possamos entender melhor o WCF Data Service.

Web Service é uma solução utilizada na integração de sistemas e na comunicação entre aplicações diferentes. Com esta tecnologia é possível que novas aplicações possam interagir com aquelas que já existem e que sistemas desenvolvidos em plataformas diferentes sejam compatíveis. Os Web services são componentes que permitem às aplicações enviar e receber dados em formato XML. Cada aplicação pode ter a sua própria "linguagem", que é traduzida para uma linguagem universal, o formato XML.

Essencialmente, o Web Service faz com que os recursos da aplicação do software estejam disponíveis sobre a rede de uma forma normalizada. Outras tecnologias fazem a mesma coisa, como por exemplo, os browsers da Internet acedem às páginas Web disponíveis usando por norma as tecnologias da Internet, HTTP e HTML. No entanto, estas tecnologias não são bem sucedidas na comunicação e integração de aplicações. Existe uma grande motivação sobre a tecnologia Web Service pois possibilita que diferentes aplicações comuniquem entre si e utilizem recursos diferentes.

Utilizando a tecnologia Web Service, uma aplicação pode invocar outra para efetuar tarefas simples ou complexas mesmo que as duas aplicações estejam em diferentes sistemas e escritas em linguagens diferentes. Em outras palavras, os Web Services fazem com que os seus recursos estejam disponíveis para que qualquer aplicação cliente possa operar e extrair os recursos fornecidos pelo Web Service.

Windows Communication Foundation (WCF) é um modelo de programação unificado e ambiente de execução (Framework) criado pela Microsoft que visam a construção de aplicações orientadas a serviços (Service Oriented Architecture).

O objetivo principal do WCF é permitir que analistas e desenvolvedores criem aplicações voltadas para computação distribuída.

O WCF possui ainda um conjunto de bibliotecas (classes) que permitem aos desenvolvedores criar estas aplicações para funcionarem sob o sistema operacional Windows. Ele é, na verdade,  uma evolução ao Web Service, isso porque ele agrupa várias tecnologias para resolver o problema na comunicação dos dados.

WCF Data Services é uma forma de expormos um modelo de dados do Entity Framework através de uma interface REST. O DS é uma extensão do WCF (isto é, pode ser hospedado como qualquer serviço WCF). É uma tecnologia que visa facilitar o acesso a dados tanto de aplicações Web comuns como AJAX, como Silverlight e .NET.

Para expor os dados via WCF Data Services, é preciso que se tenha uma fonte de dados que suporte consultas utilizando LINQ, isto é, que implemente IQueryable/IUpdatable. Resumidamente, a aplicação pede um endereço para o serviço, e este endereço é traduzido como uma consulta LINQ para que então, o provedor de dados retorne os dados de interesse.

Parece meio confuso mas na verdade o WCF Data Service nos dá as seguintes possibilidades:

  • fornece uma API que nos permite criar e consumir dados através de HTTP utilizando serviços RESTful. 
  • suporta todas as operações de banco de dados através de URI. 
  • é capaz de expor um Modelo de Entidade através de uma URI. 
  • suporta CRUD. 
  • pode ser consumido por qualquer aplicação em diferentes tipos de clientes como Windows, SilverLight, Web, AJAX e Console.

Mas vamos deixar de conversa e vermos na prática como isso funciona!

Crie um projeto do tipo Asp .Net Web Application, dê o nome de “WebAppWCFDataService”.

Feito isso, precisamos adicionar nosso WCF Data Service, para isto, clique com o botão direito na solução e adicione um item do tipo “WCF Data Service”.

wcfdata01

Figura 01 – inclusão de novo item

 

wcfdata02

Figura 02 – item do tipo WCF Data Service

 

Seu projeto deverá estar como na figura 03.

wcfdata03

Figura 03 – Solução

 

Precisamos agora de nossa fonte de dados. Estou utilizando o NorthWind para este exemplo, caso não possua um banco de dados, você pode baixá-lo aqui.

Não irei entrar em detalhes de como instalar o banco pois está fora do escopo deste post.

Vamos criar nosso mapeamento relacional, para isso adicione um item do tipo ADO .Net Entity Data Model. Ele irá apresentar várias telas para que você escolha o banco, as tabelas, o nome da conexão e o contexto, basta seguir conformes as figuras 04, 05, 06 e 07.

wcfdata04

Figura 04 – inclusão do entity data model

 

wcfdata05

Figura 05 – Seleção do tipo de Modelo

 

wcfdata06

Figura 06 – String de conexão e Context

 

wcfdata07

Figura 07 – Escolha das tabelas

 

Pronto, agora que já temos nosso mapeamento precisamos informar ao data service qual é nosso contexto e o que ele deverá disponibilizar.

Abra o arquivo WcfDataService1.svc.cs, ele deve estar como o código da listagem 1

Listagem 01

using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;

namespace WebAppWCFDataSerevice
{
    public class WcfDataService1 : DataService< /* TODO: put your data source class name here */ >
    {
        // This method is called only once to initialize service-wide policies.
        public static void InitializeService(DataServiceConfiguration config)
        {
            // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
            // Examples:
            // config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);
            // config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All);
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        }
    }
}

Altere a linha

public class WcfDataService1 : DataService< /* TODO: put your data source class name here */ >

Para

public class WcfDataService1 : DataService<NorthwindEntities>

 

Remova as duas barras da linha

// config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead);


Altere para

config.SetEntitySetAccessRule("*", EntitySetRights.All);


O que fizemos foi dizer ao nosso Data Service qual é a classe que contem o mapeamento para nossas entidades e definir as permissões para elas, no caso, definimos que todas as entidades não irão possuir qualquer restrição “EntitySetRights.All”

Compile o aplicativo, se tudo estiver correto ele deverá apresentar a tela como na figura 08.

wcfdata08

Figura 08 – aplicativo sendo executado


Bem, a princípio nada demais ok? Errado! Percebam que nosso serviço expos nossas entidades, assim podemos realizar pesquisas sem a necessidade de criarmos métodos para isso. Mas como isso é possível? Simples, como havia falado, o WCF Data Service nos fornece maneiras de realizarmos consultas em banco através de URI´s.

Vejam os exemplos abaixo.

Listar todos os Clientes
http://localhost:26482/WcfDataService1.svc/Customers

Listar todos os Clientes de São Paulo
http://localhost:26482/WcfDataService1.svc/Customers?$filter=Region eq 'SP'

Listar os 10 primeiros Produtos
http://localhost:26482/WcfDataService1.svc/Products?$top=10

Mas você deve estar se perguntando. De onde você tirou estas URI´s? É simples existe uma tabela com parâmetros de pesquisa para as URI´s conforme abaixo. Não estão todos ai, mas os mais importantes.


Operações

orderby - realiza a ordenação por um parâmetro qualquer
top - seleciona a quantidade de registros informada
filter - realiza a pesquisa com base em algum filtro

 

Operadores

eq - igual
ne - não igual
gt - maior que
ge - maior ou igual
lt - menor que
le - menor ou igual
and - AND lógico
or - OR lógico
not - NOT lógico

 

Como puderam ver, o WCF Data Service é uma nova maneira de expormos nossas entidades sem a necessidade de criarmos métodos para realizar as diversas pesquisa e operações necessárias tornando assim nossa produtividade muito maior.

Num próximo post veremos como consumir nossos Data Services, além de darmos uma passada nas permissões de acesso às entidades e segurança na troca de informações.

E lembrem-se “Informação só tem sentido se for compartilhada!”

Enjoy!!

Tags:

WCF | Desenvolvimento Web | C# | Asp .Net | Data Service

Introdução ao Asp .Net Dynamic Data

Vamos conhecer um pouco sobre Dynamic Data e ver o que ele é capaz de fazer por nós. Dynamic Data foi adicionado inicialmente no SP1 do Visual Studio 2008. Ele nada mais é, do que um framework que facilita a vida do desenvolvedor no sentido de gerar todo o CRUD (Create, Read, Update e Delete). Com Dynamic Data podemos gerar páginas de uma maneira simples e muito prática, pois ele já possui um estrutura de templates pronta para isso.

Bem vamos ver isso na prática.

Abra o Visual Studio 2010 e crie um projeto do tipo “Asp .Net Dynamic Data Linq to SQL”, dê o nome ao projeto de DynamicDataIntro conforme a figura 01.

dd_01

Figura 01 – criação do projeto


O Visual Studio irá gerar uma estrutura igual a figura 02.

dd_02

Figura 02 – estrutura de pastas


Observe que ele gerou uma pasta com o nome de DynamicData, contendo vários sub-folders. Vamos ver os principais sub-folders em detalhes.

PageTemplates – responsável por renderizar qualquer dado em qualquer tabela, basicamente seus templates são: Lista (List.aspx), Detalhes (Details.aspx), Inserir (Insert.aspx) e Edição (Edit.aspx).

EntityTemplates – permite a customização de linhas e tabelas, pois nos dá uma flexibilidade maior quanto a detalhes de linhas e campos em particular.

FieldTemplates – esta pasta contem templates para renderizar os dados conforme seu tipo, no caso o Dynamic Data verifica o tipo do dado e escolhe o modelo que mais se adequa a ele, por exemplo, se um campo for do tipo bit no banco ele irá selecionar um template Boolean para representar o dado na forma booleana.

FilterTemplates – são templates responsáveis por realizar filtros em pesquisa. Temos como templates Boolean.ascx, ForeignKey.ascx, e Enumeration.ascx

Para que o Dynamic Data possa gerar as telas para nós, precisaremos criar um mapeamento para nosso banco de dados. Para isso clique com o botão direito na solução, vá em Add New Item, selecione Data e dos templates apresentados, selecione “Linq To SQL Classes” e dê o nome de “NorthWind.dbml”. Este arquivo será responsável por conter todas as classes mapeadas de nosso banco de dados.

Para isso, no Solution Explorer, selecione um banco de dados, no meu caso estou selecionando o NorthWind, selecione as tabelas que deseja trabalhar, e as arraste para o projeto, ele deverá criar todas as classes para nós conforme a figura 03.

dd_04

Figura 04 – criação do mapeamento das tabelas em classes.


Após ter gerado as classes, o Dynamic Data cria uma classes, no nosso caso, NorthWindDataContext que irá conter todos os objetos (tabelas que selecionamos) que iremos utilizar em nosso projeto.

Agora precisamos apenas dizer ao Dynamic Data qual é o contexto que iremos trabalhar.

Procure o método public static void RegisterRoutes( RouteCollection routes ) no arquivo Global.asax, e descomente a linha

//DefaultModel.RegisterContext(typeof(YourDataContextType), new ContextConfiguration() { ScaffoldAllTables = false });

Onde está escrito YourDataContextType você irá colocar o data context que foi gerado para nós, no caso NorthWindDataContext.

Para que ele exiba as tabelas devemos também alterar o ScaffoldAllTables para TRUE.

Pronto, agora basta rodar o projeto e o Dynamic Data se encarregará de todo o resto.

Abaixo algumas  telas do projeto em execução.

dd_05

Figura 05 – tela inicial do projeto

dd_06

Figura 06 – listagem de clientes

dd_07

Figura 07 – edição de cliente

Concluindo, vimos que com apenas a alteração de uma linha de código você já ganhou um sistema completo para inclusão e manipulação dos dados, isto é Dynamic Data, preparem-se para uma nova era no mundo de aplicação .Net!

Tags:

Asp .Net | Desenvolvimento Web | Dynamic Data

Community Lauch BH

Bem pessoal, chegamos ao final de nosso Community Lauch em Belo Horizonte.

Agradecemos a todos que estiveram nos acompanhando durante os últimos 60 dias... tivemos a oportunidade de falar para diferentes públicos, em diversas faculdades: Uni-BH, Infórium, PUC e Izabela Hendrix.

Dedicamos horas de nosso esforço para trazer para a Comunidade Mineira estas informações sobre os novos produtos Microsoft para desenvolvimento, em especial Visual Studio 2010 e SQLServer 2008 R2. E temos certeza que foi muito proveitoso para todos que participaram, direta ou indiretamente.

Para aqueles que não puderam participar, fiquem atentos pois teremos muito mais pela frente.

Não deixem de nos acompanhar e faça parte dessa grande comunidade, acesse www.dotnetraptors.com.br e www.100loop.com.br

 

Valeu galera!!

 

100610_201952100610_200512

100609_205808100609_205828DSC02270DSC02271

DSC02272DSC02268

DSC02273100609_214731

Tags:

Asp .Net | C# | Desenvolvimento Web | MVC 2.0

Community Launch BH no Izabela Hendrix

Nos dias 09 e 10 de Junho teremos mais um evento de lançamento do Visual Studio 2010. André Paulovich, Ivan Paulovich e Eu estaremos no Instituto Metodista Izabela Hendrix para abordar os temas:

Desenvolvimento Web no Visual Studio 2010
Conheça a IDE do Visual Studio 2010 e os recursos que poderão acelerar o desenvolvimento de aplicações web. Além disso você verá como o Visual Studio integra com a ferramenta Microsoft Web Deployment para automatizar o processo de publicação.

Entity Framework
Apresenta o ADO.NET Entity Framework como uma plataforma de programação sobre dados saindo do modelo lógico (relacional) para o nível conceitual (entidades).

ASP.NET Dynamic Data
Conheça os recursos do ASP.NET  Dynamic Data e como ele pode trazer o conceito de RAD ao seu desenvolvimento para a Web.

ASP.NET MVC
ASP.NET MVC é um framework que permite total controle sobre o código HTML, permite integrações AJAX, possui separação de conceitos e foco em testabilidade. Essa apresentação irá guiar nos novos recursos como UI Metadata, Validação Client e Server, Templated Helpers e MVC Areas.


Não perca tempo faça já sua inscrição através dos links:

Dia 09/06 - Visual Studio 2010 e Entity Framework
https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032453828&Culture=pt-BR

Dia 10/06 - ASP.NET Dynamic Data e ASP.NET MVC
https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032453829&Culture=pt-BR

 

Esse evento tem é organizado pelo Grupo de Usuários DotNetRaptors.

Tags:

Asp .Net | Desenvolvimento Web | MVC 2.0

MEF – Managed Extensibility Framework

É uma nova biblioteca que foi introduzida no .NET Framework 4.0 que ajuda o desenvolvedor a construir aplicações extensíveis.

O MEF permite que você especifique pontos onde sua aplicação poderá ser estendida, expondo módulos que podem ser preenchidos por componentes de terceiros ou ainda importar componentes expostos por outras aplicações.

Toda aplicação que deseja suportar “plugins”, terá que se preocupar, também, em criar toda a infra-estrutura necessária para suportá-los. Ao invés de explicitamente referenciar os componentes na aplicação, o MEF permitirá efetuar o descobrimento desses componentes de forma implícita, através de composição, gerenciando tudo o que for preciso para manter essas extensões, possibilitando que sua aplicação fique dependente de uma abstração, e não de uma implementação.

Vamos ver como isso funciona na prática!

Crie um projeto do tipo Windows Forms, adicione um TabControl com duas TabPages e nomeie as tabs “Cadastro de Cliente” e “Cadastro de Funcionários”, insira alguns Labels e Textbox para simularmos um formulário de cadastro. Seu form deverá ficar como nas Figuras 01 e 02.

 

mef_01
Figura 01

 

mef_02
Figura 02

Antes de começarmos a codificar, crie uma pasta chamada “plugins” na raiz da aplicação, ela será responsável por conter as dll´s com os futuros plugins.

Pressione a tecla F7 para entrar no modo “View Code”.

Para utilizarmos o MEF devemos fazer referência a dll System.ComponentModel, ela será responsável por fornecer classes e atributos para prepararmos nosso projeto para receber componentes “plugins”.

Conforme a listagem 01, importamos o namespace System.ComponentModel.Composition e System.ComponentModel.Composition.Hosting.

Feito isso, devemos criar nosso “ponto de entrada”, para isso criamos uma propriedade do tipo TabControl que será responsável por receber as TabPages  externas, observem que decoramos nosso atributo com Import. Este atributo define uma dependência nesta parte, ou seja, durante a composição desta parte o container irá preencher esta propriedade com um componente que satisfaça este contrato.

Listagem 01

using System;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using System.Windows.Forms;

namespace WinMEF
{
    public partial class Form1 : Form
    {
        [Import]
        public TabControl TabItem { get;set; }


Vamos criar agora um método que irá carregar nossos plugins.

Listagem 02 – método para carregar plugins

private void CarregaPlugin()
{
    var catalog = new DirectoryCatalog( @"../../plugins" );
    catalog.Refresh();

    if ( catalog.LoadedFiles.Count > 0 )
    {
        var container = new CompositionContainer( catalog );
        container.ComposeParts( this );

        int x = 0;

        while ( TabItem.TabPages.Count != 0 )
        {
            tabControl1.TabPages.Add( TabItem.TabPages[x] );
        }
    }
}

 

Bem, o que fizemos em nosso método foi criar um objeto catalog que com base na class DirectoryCatalog irá varrer uma pasta chamada plugin (o nome da pasta fica a critério de cada um) e irá carregar nossa dll.

Verificamos se o objeto catalog foi carregado com alguma dll, caso tenha sido adicionamos nosso catalog a um Container. A classe CompositionContainer é responsável por “mapear” os dados da dll carregada com nosso ponto de entrada assim gerando todo o código necessário para a montagem das TabPages em nosso projeto.

Feito isso apenas varremos o controle importado e verificamos se o mesmo possui alguma tab a ser incorporada no projeto, caso possua apenas incluímos a mesma no controle.

Esta é uma infra-estrutura simples, mas podemos ver através dela como o MEF tornou o processo de criação e utilização de componentes muito simples.

Vamos ver agora como criar o “plugin”.

Crie um outro projeto do tipo ClassLibrary, dê o nome de MyTabControl. Agora devemos fazer referência a duas dll´s System.ComponentModel.Composition para o MEF e System.Windows.Forms para o TabControl.

Adicione o código abaixo a class que acabamos de criar, explicarei cada parte logo abaixo.

Listagem 03 - plugin

using System.ComponentModel.Composition;
using System.Drawing;
using System.Windows.Forms;

namespace MyTabControl
{
    [Export(typeof (TabControl))]
    public class MyTabControl : TabControl
    {
        private TabPage tabPage1;
        private TabPage tabPage2;

        public MyTabControl()
        {
            InitializeComponent();
        }

        private void InitializeComponent()
        {
            tabPage1 = new TabPage();
            tabPage2 = new TabPage();
            SuspendLayout();
            SuspendLayout();
            // 
            // tabControl1
            // 
            Controls.Add(tabPage1);
            Controls.Add(tabPage2);
            Location = new Point(0, 0);
            SelectedIndex = 0;
            Size = new Size(200, 100);
            TabIndex = 0;
            // 
            // tabPage1
            // 
            tabPage1.Location = new Point(4, 22);
            tabPage1.Name = "tabPage1";
            tabPage1.Padding = new Padding(3);
            tabPage1.Size = new Size(192, 74);
            tabPage1.TabIndex = 0;
            tabPage1.Text = "Cadastro Nota Fiscal";
            tabPage1.UseVisualStyleBackColor = true;
            // 
            // tabPage2
            // 
            tabPage2.Location = new Point(4, 22);
            tabPage2.Name = "tabPage2";
            tabPage2.Padding = new Padding(3);
            tabPage2.Size = new Size(192, 74);
            tabPage2.TabIndex = 1;
            tabPage2.Text = "Emissão de Boletos";
            tabPage2.UseVisualStyleBackColor = true;
            ResumeLayout(false);
            ResumeLayout(false);
        }
    }
}

 

O que fizemos foi, instanciar os namespaces System.ComponentModel.Composition e System.Windows.Forms. Herdamos de TabControl e decoramos nossa class com o atributo “Export”, ele faz parte de System.ComponentModel.Composition, ou seja, do MEF. Este atributo é que faz com que esta classe seja reconhecida como uma Part exportável, que depois será utilizada pelo MEF para compor uma outra parte que satisfaça um contrato, no nosso caso do tipo TabControl, ou seja, colocar esta nossa classe como um plugin em alguma outra aplicação.

Criamos também duas propriedades do tipo TabPage, que serão adicionadas em tempo de execução ao nosso projeto.

Feito isso, compile o projeto, será gerada a dll que na verdade é o nosso plugin.

mef_03
Figura 03 – dll gerada


Basta adicionarmos esta dll a nossa pasta plugin que foi criada no outro projeto e rodarmos a aplicação, o MEF se encarregará de todo o restante.

mef_04

Figura 04 – aplicação rodando e dll carregada

Bem pessoal, isso é MEF, num próximo post veremos como utilizar o MEF para criarmos aplicações estendidas para o Asp .Net MVC 2.0.

Para saber mais sobre MEF acesse http://mef.codeplex.com/

Tags:

Asp .Net | Desenvolvimento Web | MEF

Diferença entre Object, var e dynamic

Outro dia estava conversando com um amigo sobre as mudanças que o .Net vem sofrendo com o passar dos anos. Uma das coisas que ele me questionou foi: “var veio pra substituir o Object…e agora o Dynamic veio pra substituir o var?”. Bem, vamos ver o que realmente são cada um destes tipos.

Como todos sabem, Object é a classe base na plataforma .net, System.Object, ou seja, muitos dos tipos que conhecemos tem sua descendência de Object mesmo isso não sendo explicitado. Sendo assim elas passam a herdar seus comportamentos e suas propriedades, como por exemplo Equals(Object obj), ToString() , GetHashCode() dentre outros.

Atento para a informação de que quando falamos que “tudo herda de Object” estamos sendo equivocados. Caso queiram ler mais sobre o assunto sugiro o post do Eric Lippert.

Com isso, quando criamos uma variável do tipo Object ela tem a capacidade de receber qualquer valor. Vamos ver um exemplo.

Listagem 01

String str = "Luciano"; // declaração do tipo String
Object obj = str;       // boxing
String s = (String)obj; // unboxing


Observem que defini a string “Luciano” à variável str que é do tipo String. Criei uma nova variável só que desta vez do tipo Object e informei que ela receberia o conteúdo da variável str, conhecemos isso como Boxing. Criei uma nova variável o tipo String, como havia dito antes, como todos os tipos derivam de System.Object, o tipo String poderá receber o valor da variável obj, pois foi atribuído a ela uma string. Porém precisamos realizar um “cast” que é uma conversão de tipos, pois como Object aceita qualquer coisa precisamos informar que ao passar o conteúdo de obj para outra variável de outro tipo teremos que informar pra qual tipo ela irá se “converter”. Conhecemos isso como Unboxing.

Vamos ver agora o tipo var

Primeiramente, só variáveis podem ser declaradas como sendo do tipo var. Bem, se eu declarar uma variável assim, quando eu for utilizar ela, ela poderá ter qualquer valor? Não. Isso porque o compilador não deixa você declarar uma variável somente com var sem fazer uma atribuição logo na declaração, pois é através dessa atribuição que ele vai inferir o tipo da variável, ou seja, sempre que você for utilizá-la ela terá um tipo já atribuído.

O conceito var pode nos remeter a pensar que estamos regredindo e deixando com que a linguagem se torne não tipada, que será uma coisa ruim, porém não é bem assim. Vamos ver realmente uma aplicação para o conceito de var.

Listagem 02

var objVariante = new
{
    Nome = "Luciano",
    Email = "teste@teste.com.br",
    CPF = 0123456789
};


Basicamente são tipos definidos de maneira dinâmica, sem necessitar de um tipo explicito previamente definido. Observe a figura 01

objvardyn_01

Figura 01 – Criação de um tipo Anonymous

Com esta construção armazenamos duas propriedades somente leitura em um tipo anônimo representado pela variável objVariante. Um detalhe importante sobre os anonymous types é que eles não são tipos genéricos e não causam boxing e unboxing de uma maneira oculta, eles são realmente objetos fortemente tipados, a diferença é que o compilador gera a implementação para nós onde lhe for conveniente.

As aplicações para o var são muitas, porém as que realmente fazem sentido são as aplicadas a LINQ.

E finalmente dynamic

O conceito de dynamic  muda um pouco do conceito que conhecemos até o momento, pois trás o poder das linguagens dinâmicas e mescla vantagens e desvantagens com a linguagem estática que é o C#. O dynamic não se restringe somente a variáveis, ele pode ser aplicado a propriedades, retorno de métodos, parâmetros, praticamente tudo. Quando você declara utilizando o dynamic está dizendo para o compilador que o objeto ali contido é desconhecido e que todas as operações efetuadas envolvendo este objeto só serão checadas em tempo de execução ( runtime ), sendo assim é possível invocar um método inexistente sem que o compilador dê erro, quando acontecer a chamada desse método é que o acontecerá verificação desse método, checagem de parâmetros e tudo mais, se algum problema for identificado durante a verificação ocorrerá uma exceção. Com esse recurso infelizmente perdemos qualquer ajuda da IDE em relação ao intellisense, pois o conceito do dinamismo impede que saibamos sobre informações do objeto de forma prévia.

Veja um exemplo na figura 02

objvardyn_02

Figura 02 – Declaração de um objeto do tipo Dynamic

Reparem que não existe intellisense, apenas uma informação da IDE dizendo que a chamada ao método Do() será resolvida em tempo de execução. Mas se perdemos em parte com isso qual a utilidade de se usar dynamic?

Umas das grandes vantagens é a utilização de Reflection e COM Interop. Veja um exemplo.

Listagem 03

dynamic inteiro = Activator.CreateInstance( Type.GetType( "System.Int32" ) );
Console.Write( inteiro ); // Irá imprimir 0 no console

dynamic data = Activator.CreateInstance( Type.GetType( "system.DateTime" ) );
Console.Write( data ); // Imprimirá 01/01/0001

Além disso, permite a interação com linguagens dinâmicas como IronPhyton e IronRuby, possiblidade de consumir e executar códigos escritos em IronPhyton e IronRuby dentro do C#.
 
Como puderam observar, todos três tipos possuem características próprias e cada um irá executar uma função diferente dentro da programação, sendo assim, nenhuma delas veio para substituir a outra, mas sim para agregar valores à linguagem C#.

Tags:

C# | Asp .Net