web 2.0

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

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

JavaScript – Dicas

Estava trabalhando em um projeto utilizando javascript puro, sem utilizar jQuery. Precisei trabalhar com o formato JSON, porem meus objetos precisavam ser ordenados conforme a necessidade do sistema. Bem, depois de muitos testes vai uma dica:

01 - Ordenar objetos JSON

Listagem 01 – objeto JSON

var objJSON = [
      { "ID": 1, "Name": "Luciano Lima", "Email": "lima@lucianolima.com.br" },
      { "ID": 4, "Name": "Fabio Almeida", "Email": "fabio@lucianolima.com.br" },
      { "ID": 2, "Name": "Ricardo", "Email": "ric@lucianolima.com.br" },
      { "ID": 3, "Name": "Marcio", "Email": "marcio@lucianolima.com.br" }   
];

 

Acima temos o objeto que iremos ordenar. Vamos criar dois métodos, “OrdenarPorId(objA, objB)” e “OrdenarPorNome(objA, objB)”.

Listagem 02 – métodos de ordenação

function OrdenarPorId(objA, objB) {
  return objA.ID - objB.ID; 
}

function OrdenarPorNome(objA, objB) {
  return ((objA.Name == objB.Name) ? 0 : ((objA.Name > objB.Name) ? 1 : -1 ));
}


Ok. Agora que temos nossos dois métodos podemos realizar a ordenação do objeto. Mas como isso funciona? Bem, para que consigamos realizar a ordenação devemos chamar o método “sort()” que é nativo de objetos do tipo Array, passando nossos métodos como callback. Quanto do  o método “sort()” for iniciar a ordenação, ele vai enviar os objetos para nossos métodos, eles irão realizar a ordenação e retornar para o método “sort()”, assim caso precisemos de outra forma de ordenação, basta criar um terceiro método da forma que lhe convier.

Na listagem abaixo temos a forma de como invocar nossa ordenação. Criei apenas mais um método para exibir a saída.

Listagem 03 – invocando a ordenação

function Exibir(obj) {
    for (var o in obj)
        document.writeln("Id " + obj.ID + ", Nome " + obj.Name + ", Email " + obj.Email);
}

// Chamada ao objeto original
Exibir(objJSON);

// Chamada ao objeto ordenando por ID
objJSON.sort(OrdenarPorId);
Exibir(objJSON);

// Chamada ao objeto ordenando por Nome
objJSON.sort(OrdenarPorNome);
Exibir(objJSON);

 

02 - Método para Formatar uma String

Como todos sabem o Javascript ainda tem que melhorar muito, no mesmo projeto que estava utilizando o JSON como padrão dos objeto, precisei formatar uma string para um padrão definido pelo usuário, porém minha surpresa foi que a “classe” “String” do javascript não possui um método “format” então fui obrigado a criar uma implementação, espero que aproveitem.

Listagem 01 – implementação do método format

function _formatInline() {
    var _value = this;
    for (var i = 0; i < arguments.length; i++) {
        var regExp = new RegExp('\\{' + (i) + '\\}', 'gm');
        _value = _value.replace(regExp, arguments[i]);
    }

    return _value;
}

function _formatStatic() {
    for (var i = 1; i < arguments.length; i++) {
        var regExp = new RegExp('\\{' + (i - 1) + '\\}', 'gm');
        arguments[0] = arguments[0].replace(regExp, arguments[i]);
    }
    return arguments[0];
}

if (!String.prototype.format) {
    String.prototype.format = _formatInline;
}

if (!String.format) {
    String.format = _formatStatic;
}

 

Para utilizarmos esta implementação basta chamar o método “format” direto de uma string ou utilizar a classe String conforme na listagem 02.

Listagem 02 – utilização

// implementação com String.format
var text = String.format("Esta {0} será formatada com {1} {2}","sentença","nosso","método");

// implementação com "".format
var text = "Esta {0} será formatada com {1} {2}".format("sentença","nosso","método");

 

Enjoy!!

Tags:

JavaScript | Desenvolvimento Web | jQuery

jQuery – Truques e Dicas


Dica 01 -
Prevenir “Recortar”, “Copiar” e “Colar” informações de um TextBox.

É bem útil quando estamos criando formulário onde o usuário deve digitar o e-mail em um campo e digitá-lo novamente em outro para que possamos verificar se os mesmos são idênticos.

Listagem 01

<html>
<script type="text/javascript">
$(document).ready(
    function() {
        $("#txtName").bind('cut copy paste', function(e){
            e.preventDefault();
            var _type = "";
            
            switch(e.type)
            {
                case "cut": 
                    _type = "cortar";
                break;
                case "copy": 
                    _type = "copiar";
                break;
                case "paste": 
                    _type = "colar";
                break;
            }

            alert("Voce nao pode " + _type + " o texto");
        });
    });
</script>
 <body>
    <div id="hello">
    <input type="text" id="txtName" />
    </div>
 </body>
</html>


O que fizemos foi definir no método bind() do jQuery quais eventos estamos monitorando, coloquei um “switch” para podermos exibir as informações em português, verificamos qual deles foi lançado e fazemos a conversão, tudo muito simples.

Dica 02 – Prevenir digitação de letras ou números

Listagem 02 – permitir somente números

<html>
<script type="text/javascript">
$(document).ready(
    function() {
        $("#txtName").bind('keyup blur', function(e){
            e.preventDefault();
            
            if(this.value.match(/[a-zA-Z]/g))
            {
                this.value = this.value.replace(/[a-zA-Z]/g,'');
            }
        });
    });
</script>
 <body>
    <div id="hello">
    <input type="text" id="txtName" />
    </div>
 </body>
</html>

Listagem 03 – permitir somente letras
<html>
<script type="text/javascript">
$(document).ready(
    function() {
        $("#txtName").bind('keyup blur', function(e){
            e.preventDefault();
            
            if(this.value.match(/[0-9]/g))
            {
                this.value = this.value.replace(/[0-9]/g,'');
            }
        });
    });
</script>
 <body>
    <div id="hello">
    <input type="text" id="txtName" />
    </div>
 </body>
</html>

Novamente utilizamos a função “bind()” para monitorarmos os eventos keyup e blur.
Utilizamos também expressão regular para informar, no primeiro código, que não são permitidas a inserção de letras no campo “/[a-zA-Z]/g”.

No segundo código invertemos, fazendo com que sejam permitidas entrada de caracteres não numéricos “/[0-9]/g”.


Dica 03 – evite chamar o mesmo objeto várias vezes

Muitas vezes precisamos carregar um objeto para podermos trabalhar com ele, a maioria dos programadores fazem como na listagem abaixo:

Listagem 04

$('#txtName').css('background-color', '#00f0a0');
$("#txtName").val("digite seu nome");
$('#txtName').addClass('inputbord');
$('#txtName').show(1000);

Porem devemos carregar o objeto apenas uma vez conforme abaixo:

Listagem 05
var objName =  $('#txtName');
    objName.css('background-color', '#00f0a0');
    objName.val("digite seu nome");
    objName.addClass('inputbord');
    objName.show(1000);

Desta forma mantemos a variável em cache e pronta para uso!

Estas são dicas bem simples mas que muitas vezes são bem úteis, espero que aproveitem.

Tags:

jQuery | Desenvolvimento Web

C# 4.0 – Parâmetros Opcionais e Nomeados

Uma das novidades implementadas na linguagem C# 4.0 foi a adição de Named and Optional Parameters.

Parâmetros Opcionais e Nomeados são duas características bem distintas e muito úteis quando utilizadas juntas. Parâmetros opcionais permitem que você omita alguns argumentos quando da chamada a um método. Já os Parâmetros Nomeados é uma forma de oferecer um argumento usando o nome do parâmetro correspondente em vez de depender da sua posição na lista de parâmetros.

Algumas APIs, principalmente as interfaces COM, como as APIs de automatização do Office, são escritas especificamente com parâmetros nomeados e parâmetros opcionais em mente. Até agora tem sido muito doloroso chamar essas APIs em C #, algumas vezes chamamos métodos com muitos argumentos e todos devem ser explicitamente passados, sendo que a maioria possuem valor padrão e poderiam ser omitidos.

Mesmo em APIs para. NET, você às vezes encontra-se obrigado a escrever muitas sobrecargas de um método com diferentes combinações de parâmetros, a fim de proporcionar o máximo de usabilidade para os utilizadores. Com a implementação de Parâmetros Opcionais e Parâmetros Nomeados, não necessitamos mais de criar tais sobrecargas, tornando assim nossos códigos mais limpos e reutilizáveis, além é claro de nos oferecer uma manutenção muito mais prática.

Parâmetros Opcionais

Para declararmos parâmetros opcionais basta apenas definirmos valores padrão para eles

public static int FazAlgo( int x, int y = 2, int z = 5 )
{ 
    return x + y + z; 
}

Nome método acima os parâmetros “y” e “z” são opcionais, isso nos dá a flexibilidade de realizarmos as seguintes chamadas sem a necessidade de criarmos overload do método.

static void Main( string[] args )
{
    Console.WriteLine( FazAlgo( 5 ) );    // omitindo y e z
    Console.WriteLine( FazAlgo( 5, 7 ) ); // omitindo apenas z
    Console.WriteLine( FazAlgo( 5, 7, 9 ) );
    Console.ReadLine();
}

Nomeados e Argumentos Opcionais

No C#4.0 apesar de possuirmos os argumentos opcionais, argumentos entre virgula não podem ser omitidos, assim como FazAlgo( 5, , 9 ), para que isso seja possível devemos passar estes argumentos através de seu nome. Veja abaixo.

static void Main( string[] args )
{
    Console.WriteLine( FazAlgo( 5, z: 10 ) );  // passagem do argumento por nome
    Console.WriteLine( FazAlgo( z:4, x:5, y: 14 ) ); // passagem dos argumentos de forma inversa
    Console.ReadLine();
}

Observem também que podemos inclusive mudar a ordem dos argumentos sem que isso interfira na chamada ao método.

Esta melhoria que o C# 4.0 recebeu nos ajudou bastante principalmente no que diz respeito a overload de métodos onde o custo para criação e manutenção é grande se vermos pelo lado de que podemos ter métodos com mais de 7 overloads, imaginem a manutenção disso, seria muito custosa.

Tags:

C# | Desenvolvimento Web