Os treinamentos oferecidos pela Accendis, tanto em .NET como em outras áreas, são voltados para profissionais que realmente necessitam de um conhecimento prático para conseguir uma rápida entrada no mercado de trabalho ou mesmo, uma notável progressão de conhecimento técnico para os profissionais que já estejam no mercado. Logo, estes cursos não são voltados para certificações da Microsoft e tampouco usam material oficial. O curso conta com uma apresentação, material impresso com detalhes da aula e os exercícios feitos em classe. Em qualquer treinamento, os alunos recebem um exemplar original do livro-texto do curso.

Se você ou sua equipe necessita de treinamento prático, rápido e objetivo, a Accendis está aqui para atender a sua necessidade. Oferecemos treinamento in-company e também, salas de aula regulares com até 10 alunos por turma. Desta forma, podemos garantir a qualidade e o aprendizado de todos os alunos presentes. Nosso treinamento in-company é ministrado nas cidades de Campinas, São Paulo e proximidades. Nossa sala de aula fica em Paulínia em local de facílimo acesso e amplas opções de transporte público e estacionamento gratuito. Fique atento para a divulgação de novas turmas! Veja no site da Accendis os detalhes de preços e promoções que temos disponíveis no momento.

Os treinamentos poderão ou não ter provas finais. Os conteúdos poderão ser ajustados para uma determinada turma. Para cada caso, a Accendis deverá ser comunicada para realizar as diversas adaptações necessárias.

Os cursos podem ser vendidos separados ou em grupo. Os treinamentos foram criados de forma que o aluno tenha continuidade entre os diversos módulos. Os pré-requisitos e demais informações são informados com mais detalhe a seguir:

A ementas também podem ser baixadas em formato PDF. Clique no link abaixo para realizar o download:

Grande abraço
Equipe Accendis

, , , , ,
Adicionar aos Favoritos BlogBlogs Adicionar esta notícia no Linkk

Introdução

Este artigo visa demonstrar alguns conceitos básicos para você que está começando a trabalhar profissionalmente com .NET e se encontra no seguinte momento da carreira: “Vou começar um projeto do zero, qual é a melhor forma de se trabalhar?”

Vamos apresentar alguns tópicos interessantes sobre o conceito de camadas e noções de arquitetura de sistemas empresariais comuns. Vamos discutir de forma simplificada como os conceitos se relacionam, para que de fato, você consiga ter um norte para começar a desenvolver um projeto. E por fim, vamos demonstrar como tudo isso acontece organizando os projetos no Visual Studio 2008. No final do artigo temos o exemplo completo para download.

Conceitos Iniciais: Perguntas e Respostas

  1. Ouço muito falar em desenvolvimento n-camadas. Mas exatamente o que são camadas?
    É praticamente um consenso no mercado a separação do software em camadas. Para saber quais são as camadas físicas da aplicação, basta fazer a seguinte pergunta: “Em quais máquinas meu sistema irá rodar?”. Como respostas comuns, a vasta maioria das aplicações em .NET rodam em um servidor Web com o auxílio de um servidor de banco de dados. Portanto, temos 3 camadas físicas rodando em 2 máquinas: Apresentação (servidor web), Regras de negócio (servidor web) e Persistência (servidor de banco de dados e servidor web).

    Outras correntes de pensamento julgam que o número de camadas é proporcional ao número de componentes que podem rodar independentemente. Por exemplo, no caso acima, se tivéssemos também um Windows Service com o qual a parte web se comunicasse, teríamos uma quarta camada. Mesmo que o serviço rode na máquina da web.  Ou seja, na prática, o que vale mesmo é o número de “pedaços de software independentes” que fazem alguma coisa. Podemos dizer que a camada de negócios é independente pelo fato que ainda é possível rodar apenas a lógica de negócios sem a necessidade da camada de apresentação através de técnicas simples como testes unitários, por exemplo.

    Camadas lógicas são grupos de funcionalidade geralmente reutilizáveis, mas que não conseguem rodar dentro de um contexto isoladamente. Por exemplo, podemos falar em camada de acesso a dados: tal camada lógica pode ser chamada de um serviço do WCF, de uma aplicação Web clássica ou então, de uma aplicação Windows comum. Uma camada física pode conter várias camadas lógicas. Por exemplo, a camada de negócios pode conter uma camada de regras de negócio, outra camada de controle de segurança, etc…  Mas necessariamente estão no fluxo de dados principal da aplicação.

    Resumindo, camada é todo o “pedaço de software” que participa do fluxo de dados principal da aplicação. Caso o “pedaço de software” não participe mandatoriamente do fluxo de dados principal, mas é sempre utilizado de alguma forma, provavelmente estamos em vista do que chamamos de componente.

  2. O que são componentes na prática?
    Componentes são conjuntos de classes e funções agrupados por funcionalidade similar, que podem servir a qualquer tipo de propósito e podem ser chamados por qualquer outra camada, componente ou mesmo, várias camadas e componentes. Geralmente  os componentes são pensados com o reuso em mente. Inclusive, geralmente vemos que as empresas se preocupam mais em criar componentes do que camadas reutilizáveis. Na prática, ao criar uma camada de acesso a dados, não temos como reutilizar em outro projeto totalmente diferente. Porém, um componente de controle de exceções ou componente de envio de e-mail é sempre reutilizável.
  3. O que são aplicações corporativas na prática
    Aplicações corporativas são aquelas onde a sua razão de existir se justifica pela real necessidade de resolver um problema da empresa. Simples assim. Ela serve para otimizar algum processo interno, podendo ter uma criticidade alta e também, podendo ser responsável por causar grandes prejuízos à empresa caso ela não esteja no ar. Podemos afirmar que na prática, todas as aplicações corporativas trabalham com banco de dados em algum momento. Aplicações não-corporativas são aquelas que na prática são úteis apenas para uma pessoa e não para um conjunto de pessoas ou então, no caso de jogos, servem para diversão. Tais aplicações podem ser muito mais complexas ou muito mais simples do que aplicações corporativas e quase sempre são pensadas de formas totalmente distintas de uma aplicação corporativa.

Cuidados importantes

O desenvolvimento em múltiplas camadas exige que o desenvolvedor/arquiteto tenha muito senso de organização. Nós da Accendis já presenciamos vários equívocos. Vamos a eles:

  1. Não exagere no número de camadas! Utilize o mínimo de camadas necessário para que a aplicação funcione hoje e amanhã, quando for preciso criar novas funcionalidades. Quanto maior o número de camadas, maior será a lentidão da aplicação, pois os dados deverão atravessar mais obstáculos do que o necessário.
  2. Não tenha medo de separar em camadas! Há uma grande quantia de sites que usam apenas um projeto Web para fazer tudo do sistema. Tudo! Outras equipes usam o mesmo Windows Service (.exe) para colocar todas as regras de negócio do sistema, tornado-o impossível de debugar. O maior erro dos desenvolvedores é não pensar na testabilidade do código, isto é, provar de jeito simples que o código funciona. E depois, o Visual Studio é bem prático para se trabalhar com vários projetos. Como outras vantagens, temos maior clareza e organização, e no caso onde há controle de versão, quanto maior o número de arquivos e projetos, mais divisíveis são as tarefas.
  3. Evite adotar padrões de projeto prontos que são facilmente encontrados na web. Não é por que parece ser lindo usar alguns tipos de elementos de arquitetura que você realmente precisará usar. O exemplo mais clássico disso é o fato de se usar uma camada de regras de negócio que na prática, só serve pra chamar a camada de acesso a dados.
  4. Não confunda os papéis das camadas! Evite colocar regras de negócio nas páginas de code-behind. Evite colocar nas regras de negócio componentes que podem ser reutilizáveis… Enfim, use o bom senso!
  5. Use e abuse do conceito de Namespaces. Separe classes similares em pastas. Esta dica é especialmente importante para código VB.NET, onde a lógica de namespaces é confusa para os recém-chegados.
  6. Geralmente se cria 01 projeto para cada camada lógica da aplicação. Não se recomenda juntar camadas num mesmo projeto (isto é, uma DLL com mais de uma função geral). Não se recomenda também criar vários projetos para um propósito similar.
  7. Cuidado ao utilizar padrões novos/avançados de projeto, como por exemplo, inversão de controle, arquitetura de plugins ou suporte a script. Use tais recursos somente se for absolutamente necessário e se todos os riscos de fracasso estiverem controlados. O mesmo vale para arquiteturas Web 2.0, como RIAs, MVC, etc… Atualmente, a escolha da tecnologia da camada de apresentação acarreta em alterações profundas na arquitetura do sistema com um todo. O fluxo de dados se modifica radicalmente. O maior risco é a falta de conhecimento dos desenvolvedores, que já são obrigados a absorver as novidades tecnológicas em uma velocidade estonteante. Mas, sempre esteja informado sobre novidades arquiteturais, pois as mesmas podem causar uma drástica redução da carga de trabalho. Um grande exemplo é o uso do Entity Framework ou NHibernate.
  8. Refactoring não é crime! Não tenha medo de alterações grandes no seu projeto! Projetos são feitos para resolver o problema do business. Como o problema a ser resolvido pode mudar com o tempo, seu projeto e sua arquitetura também podem ser influenciados. Por exemplo, podemos ter uma página da web com alguma funcionalidade que precise também estar presente em aparelhos móveis. Obviamente as mudanças são necessárias no número de camadas, nas formas de trocas de mensagens, etc. Outro exemplo pode ser a remoção de uma camada de acesso a dados antiga feita em ADO.NET clássico para evoluir com o LINQ ou NHibernate. Outras vezes, você ser surpreendido com a necessidade de suportar mais de um banco de dados na mesma aplicação. As coisas mudam. Não seja resistente a mudanças. Aproveite!

Arquitetura básica de um projeto Web em ASP.NET

Os projetos web de hoje em dia são relativamente complexos. E projetos de grande porte geralmente acompanham serviços, executáveis e demais acessórios para realizar tarefas diversas que não sejam apenas respostas a requisições da Web.

Porém, de alguma forma tais aplicações estendem ou imitam o padrão. Basicamente, quando se usa .NET, a receita de bolo é a seguinte, mas não necessariamente a mais “profissional” ou “correta”:

  1. [Camada de apresentação] Crie um projeto do tipo “Web Application” no Visual Studio. Não crie o projeto como “Web Site” pois esta decisão acarreta em várias dificuldades em criar funcionalidade comum a todas as páginas e causa dificuldades grandes ao referenciar dlls de outros projetos.
  2. [Camada de negócios] Para a camada de negócios, geralmente se cria um projeto do tipo “Class Library” para conter regras de negócios e outra “Class Library” para conter as entidades da aplicação. Portanto devem ser criados 2 projetos. Vale relembrar que os projetos do tipo “Class Library” são bibliotecas que quando compiladas viram DLLs comuns.
  3. [Camada de acesso a dados / Persistência] No mínimo sua aplicação terá que acessar os dados de alguma forma. Os dados podem ser expostos pelo banco em forma de tabelas, views ou stored procedures. Para isso, você terá que escrever ou usar outra solução que automatize o processo de criação de métodos para se comunicar com o banco. Crie um projeto do tipo “Class Library” para o projeto de acesso a dados também.
  4. [Componentes] Crie uma biblioteca de componentes utilitários. Este projeto deverá conter componentes úteis para todas as camadas. No caso real, pode haver mais projetos de componentes.
  5. [Testes Unitários] Crie uma biblioteca para guardar testes unitários. Para isso, é preciso ter alguma versão do Visual Studio que suporte a criação de testes unitários ou então, usar o NUnit para criar os testes.

Com isso, vamos acabar com uma solution com 6 projetos, ainda isolados entre si. Vamos discutir sobre como referenciar os projetos dentro da solution.

  1. Todas as camadas devem referenciar a DLL de entidades da aplicação.
  2. O projeto de testes unitários deverá referenciar todos os projetos da aplicação, com exceção do projeto Web.
  3. O projeto Web referencia a DLL de negócios.
  4. O projeto de negócios referencia a DLL de acesso a dados.
  5. Todos os projetos, inclusive o de testes unitários, poderão referenciar a DLL de componentes, à medida da necessidade.

O diagrama conceitual da Solution do Visual Studio fica com o mostrado nas figuras abaixo. Como nós da Accendis já passamos por vários projetos em várias empresas, uma das tendências que encontramos foi a nomenclatura em inglês de namespaces, classes e métodos. Mas na prática, muitas pessoas acabam misturando as nomenclaturas para que o nome fique o menor possível. O maior argumento para usar nomenclatura em inglês é o fato de haver chances de vender o sistema para algum comprador internacional, tendo como premissa que o cliente final deverá ter condições de manter o código.

Na imagem abaixo estão os detalhes de cada projeto a ser criado:

Lista de todos os projetos a serem criados no Visual Studio

Lista de todos os projetos a serem criados no Visual Studio

Nesta imagem abaixo, podemos ver um desenho mostrando as dependências entre cada projeto:

Relacionamento entre os diversos projetos da Solution do Visual Studio

Relacionamento entre os diversos projetos da Solution do Visual Studio

Conclusão

Com esta noção inicial de como organizar um projeto, como referenciar projetos e soluções, você está pronto para começar a entender ou mesmo criar um projeto empresarial Web comum de médio porte. Entretanto, este modelo muitas vezes pode ser estendido com mais pedaços de software, como Web Services, Windows Services e mesmo, alguma camada de aplicação RIA, como Silverlight ou Flex.

Antes de encerrar este artigo, queremos deixar claro que quase sempre compensa fazer este tipo de solução, com componentes separados em camadas. O que se vê por aí é que o projeto começa pequeno, cresce desordenadamente e fica impossível de se trabalhar com o tempo. Logo, o tempo inicial para montagem da solução compensa o esforço de refactoring futuro.

Para baixar esta solução de exemplo, clique aqui para obter a solução em formato zip, utilizando Visual Studio 2008 Team System e compilado em .NET Framework 3.5 SP1. No projeto de testes, referenciamos a DLL NUnit.Framework.

Dúvidas, Sugestões, Reclamações ou Dicas? Comente!

Grande abraço!
Mário Meyrelles (http://twitter.com/mariomeyrelles)
Equipe Accendis

, , ,
Adicionar aos Favoritos BlogBlogs Adicionar esta notícia no Linkk

Introdução

Periodicamente vamos publicar este tipo de post para responder a algumas questões que surgem no nosso dia-a-dia, nos nossos treinamentos ou mesmo, ao conversar com profissionais de diferentes áreas de conhecimento.

Neste post vamos falar sobre como é trabalhar com .NET. Você saberá o que é preciso para começar a aprender, caminhos de aprendizado, tendências, comparação com outros frameworks concorrentes, ferramentas e dicas diversas. Vamos lá!

1. O que é a plataforma .NET?

Falando de forma resumida, a plataforma .NET é um conjunto de ferramentas e infraestrutura para executar código geralmente escrito em C# ou Visual Basic.NET. Na prática, usa-se .NET em vários contextos, como Websites dinâmicos, programas para Windows Forms e aparelhos móveis como celulares e dispositivos móveis diversos que contenham sistemas embarcados.

2. Qual é a linguagem de programação para usar com .NET?

Basicamente, temos o C# e o VB.NET. O C# é a linguagem com o maior suporte na comunidade e com a maior quantidade de exemplos. Sua sintaxe é limpa, absorvendo a parte boa de linguagens Java e C++ e até mesmo, absorve conceitos de linguagens mais modernas. A linguagem VB.NET possui compatibilidade total em termos de funcionalidade com a linguagem C#. Ela é usada normalmente por empresas que já utilizavam alguma tecnologia baseada em VB6. No Brasil seu uso é muito difundido e em projetos de migração de ASP 3.0 para ASP.NET, por exemplo, em quase 100% dos casos a migração termina com VB.NET. Como nossa opinião , recomenda-se o uso do C#, pois o mesmo nasceu para a plataforma .NET e a Microsoft jamais a tirará do mainstream. A maioria das consultorias que usam o C# como linguagem padrão e até mesmo, impedem formalmente o uso de VB.NET. O mercado também, embora de forma velada, demonstra certo preconceito contra programadores de VB/VB.NET, já que é possível programar sem regras tão rígidas como as do C#.

3. O que é preciso para começar a aprender .NET?

Na prática, todos nós aprendemos .NET e tecnologias correlatas, como Javascript e linguagem SQL para conseguir criar aplicações que acessam dados. Para se trabalhar com .NET é preciso utilizar ferramentas que não são gratuitas. Embora seja possível trabalhar com ferramentas gratuitas, na prática, as ferramentas gratuitas não permitem que você crie aplicações profissionais como por exemplo, aplicações de várias camadas no mesmo projeto. Os investimentos da Microsoft são realizados apenas para o Visual Studio e todos os fabricantes de plugins só consideram a existência do Visual Studio.

Para começar o ideal é conseguir uma versão trial tanto do Visual Studio como uma versão trial do SQL Server 2005/2008. Com isso o aprendiz já tem a capacidade de criar coisas profissionais e já tem a visão de como se trabalha no dia-a-dia com .NET e SQL Server. Outra opção é conseguir uma máquina virtual configurada. Isso isola completamente o ambiente de desenvolvimento, mas em compensação, há o custo de HD, CPU e memória extra a ser considerado nesta opção. Para usar tranquilamente uma máquina virtual recomenda-se 4GB de memória e CPU de 2 ou mais núcleos.

Porém, além das ferramentas acima, não é preciso mais nada. Não é preciso conseguir plugins, componentes de terceiros ou nada a mais em especial para começar a desenvolver aplicações comuns, diferentemente de Java, que obriga o desenvolvedor a ter que procurar ferramentas diferentes para tipos diferentes de projeto – ou pior(?!) – permite que o mesmo trabalho seja feito com diferentes ferramentas. Entretanto, com o passar do tempo você poderá instalar algumas extensões para o Visual Studio, como por exemplo, um conjunto de controles visuais profissional, como o oferecido pelo Telerik.

4. Quais são os tipos mais importantes de aplicações .NET?

No Brasil, a maioria esmagadora de vagas exige o conhecimento de ASP.NET, que é a criação de páginas dinâmicas com .NET. A construção de páginas em ASP.NET na prática exige mais do desenvolvedor, como conhecimento em SQL Server, ADO.NET, Javascript, CSS e mais recentemente, tecnologias Ajax. Nas exigências de conhecimento em banco de dados, as empresas exigem que o desenvolvedor saiba criar procedures, functions, triggers e views. Logo, para quem está querendo lugar no mercado de desenvolvimento, basicamente é preciso que se saiba apenas a parte Web. Pode ser necessário também conhecer o desenvolvimento de Webservices e mais recentemente, serviços do WCF.

Entretanto, há muitas empresas que desenvolvem para Windows Forms e também, desenvolvem Windows Services. Este conhecimento é importante mas não é tão necessário para o mercado, embora os mesmos sejam até mais simples para se trabalhar.

Outro ramo que surge com crescente interesse é o desenvolvimento de aplicações para celulares e dispositivos móveis, tanto para Windows (aplicações para um celular como por exemplo um gerenciador de contatos comum) como para ASP.NET (por exemplo, um site de banco).

As áreas de desenvolvimento para Office e Sharepoint estão crescendo mas ainda não são tão importantes como o desenvolvimento Web. O .NET só ganhou grande importância e grande quantidade de usuários devido ao seu modelo de programação para aplicações Web.

5. Comparação de .NET com PHP e Java (J2EE)

O PHP possui também um grande mercado e grande parte de suas ferramentas são livres. O Java também. Entretanto, o PHP é uma tecnologia exclusivamente desenhada para sites Web (por favor me corrijam se eu estiver errado neste ponto!) e não serve para aplicações desktop ou de outros tipos comuns. Logo, não se usa PHP para aplicações empresariais complexas. O .NET foi criado pela Microsoft para concorrer com a Sun no disputado mercado de linguagens de programação.

Após ambas tecnologias chegarem à maturidade atual, é difícil apontar algo que não seja possível criar com as versões máximas de cada tecnologia, com qualquer tipo de ferramenta a disposição e com orçamento ilimitado. Quem trabalha com .NET poderá ter dificuldade de criar aplicações modernas para Linux, já que é preciso utilizar o Mono para compilar o código. Já quem utiliza Java poderá ter dificuldade de conseguir criar os designs estonteantes que o WPF (Windows Presentation Foundation) permite criar.

Na prática, aplicações empresariais são criadas hoje em dia apenas com Java (J2EE) ou com .NET. A escolha da tecnologia é geralmente moldada pelas necessidades do cliente final, como a hospedagem, licenças disponíveis e etc. Quanto aos custos de aprendizado, ambos são similares. Quanto aos custos de se usar tais tecnologias, o custo tanto dos desenvolvedores como os de software podem variar muito. Muitas vezes a variável que acrescenta custo ao projeto é externa, como por exemplo, o custo maior do banco de dados Oracle em relação ao SQL Server. O .NET segue mainstream na Microsoft e o Java pertence à Sun, que até o momento da escrita deste post está para ser comprada pela Oracle. Acreditamentos que o desenvolvimento de melhorias para as tecnologias baseadas em Java continuarão a todo vapor.

Para quem está começando, recomendamos o uso do .NET atual, que está muito maduro, possui uma excelente linguagem de programação, excelente suporte e principalmente, um ecossistema de tecnologias e fornecedores muito simplificado. É sempre o mesmo servidor web, sempre a mesma forma de instalar, sempre a mesma forma de desenvolver a aplicação web – sem grandes dificuldades em termos de infraestrutura. Para quem está na faculdade ou numa empresa de desenvolvimento, há chances de haver uma chance de parceria com a Microsoft para fornecimento de sistemas operacionais e ferramentas de desenvolvimento, tornando o custo inicial de adoção e aprendizado menor. Por exemplo, a Accendis conta parceria da Microsoft tendo acesso a grande parte dos seus produtos para desenvolvimento de aplicações.

6. Quem ganha mais? Um desenvolvedor Java ou .NET?

Essa questão é realmente complicada de responder. Mas conversando com os nossos colegas de mercado tanto de Java como .NET, vimos a notar que de fato, os salários são similares. Acredita-se que o mercado de desenvolvedores Web é maior para quem trabalhar com tecnologia .NET. Já para quem trabalha com Java, acredita-se que o mercado é maior para quem trabalha com aplicações empresariais ligadas a processos de negócio. Para vagas sênior de São Paulo, salários CLT tanto de .NET como Java pagam de 5.000 a 7000 reais, dependendo das necessidades de skill da vaga e se realmente, você for apenas programar e no máximo, liderar uma equipe – isto é – se você não for gerenciar projetos. Para vagas de pleno temos uma faixa de 3.000 a 5.000 reais e para júnior, até 3.000 reais. Os valores são válidos para São Paulo e região.

7. Em resumo, quais são as coisas que um desenvolvedor típico de .NET precisa saber?

Em resumo um desenvolvedor completo de .NET precisa saber:

  • C# ou VB.NET (orientação a objetos, construções, arquitetura de eventos, etc…)
  • ASP.NET (ciclo de uma páginas web, arquitetura cliente-servidor)
  • ASP.NET Ajax
  • HTML
  • Javascript
  • CSS
  • Webservices/WCF
  • SQL Server (linguagem T-SQL)
  • Criação de Windows Services
  • Noções de separação de camadas da aplicação
  • Compreensão de diagramas da UML

Outros tipos de skill podem ser cobrados de forma mais específica, com por exemplo, conhecimento em Business Intelligence, conhecimentos matemáticos, edição de imagens e conhecimento em design,  Windows Workflow Foundation, Sharepoint, Integração com Office e mais.  Porém o que as pessoas mais valorizam numa empresa comum (isto é, sem ser uma consultoria de software) é a capacidade de transformar regras de negócio em melhorias para a empresa. O desenvolvedor que aprende a regra de negócios, que consegue gerar documentos adequados e consegue fazer com que seu time gere valor com o software tem grandes chances de subir em sua carreira. Pessoas assim não são só apenas programadores, mas sim, analistas de sistemas e mais tarde, gerentes de equipe, gerentes de TI e eventualmente, assumem posições com capacidade de decidir sobre a evolução do business.

8. Ok! Como fazer para começar com o aprendizado?

Realmente, o melhor jeito de começar é lendo algum livro e começar pelo caminho do auto-aprendizado. As faculdades atualmente não ensinam o .NET na sala de aula e portanto é preciso procurar por tutoriais, livros, revistas e mesmo cursos. O importante é que você já precisa conhecer programação para começar a aprender .NET, Java ou demais tecnologias atuais.

Há inúmeras fontes de informação e após ler os conceitos básicos da linguagem, use seu tempo e crie por exemplo, um cadastro simples e depois um sistema completo um pouco menos simples – com essa experiência você conseguirá ter uma real noção dos problemas que acontecem como erros de todos os tipos.

Dependendo do projeto, das experiências vividas na empresa e aplicação do desenvolvedor, diz-se que é possível ver uma pessoa chegar a um nível pleno em 12 meses. E vale lembrar que mesmo que você já conheça alguma tecnologia, você sempre será iniciante em uma tecnologia mais nova. Por exemplo, se você já conhece ASP.NET não necessariamente será bom em Silverlight sem estudar, sem se aplicar e sem ter horas de vôo na tecnologia em questão. Evite estudar/adotar tecnologias muito novas que ainda não possuem o devido grau de suporte e aceitação no mercado.

Grande Abraço

Equipe Accendis.

,
Adicionar aos Favoritos BlogBlogs Adicionar esta notícia no Linkk

Introdução

Muitas vezes é necessário debugar a página que do jeito que aparece no browser, tentando entender o fluxo de javascript, chamadas ajax, estilos de CSS e organização dos elementos na página. Para ajudar a desenvendar o que se passa no browser selecionamos 2 plugins muito úteis que complementam o Firefox.

All-in-one Sidebar

Simplesmente obrigatório. Gerencia os plugins, downloads, complementos do próprio Firefox, temas e principalmente, organiza muito bem os favoritos. E dentro dos favoritos é possível ter uma pasta de feeds rss também.

Clique aqui para obter o add-on!

Brief

Um excelente leitor de feeds RSS. Capaz de interpretar também imagens, animações em flash, bookmarks, lixeira e também, é capaz de exportar sua lista de feeds para um arquivo .opml .

Clique aqui para obter o add-on!

Firebug

O Firebug simplesmente é uma ferramenta obrigatória para qualquer desenvolvedor web. Este complemento destrincha qualquer página web, inspecionando o html, debugando o javascript gerado, analisando o css (inclusive, overrides de elementos), mede o peso da página e também, permite que você analise os requests e responses em total detalhe. Muito superior ao Fiddler do Internet Explorer.

Clique aqui para obter o add-on!

Web Developer

Este add-on é muito útil, aparecendo como uma nova barra de ferramentas na tela do Firefox. Com esta barra, é possível realizar várias operações interessantes como exibir divs, esconder imagens, mostrar erros de código e css, modificar o html e arranjo de frames, e várias outras funcionalidades muito numerosas e precisam ser exploradas conforme sua necessidade. Com o Firebug e Web Developer, você tem a total visão de conjunto de sua página web.

Clique aqui para obter este add-on!

Grande abraço e até a próxima!

Equipe Accendis

,
Adicionar aos Favoritos BlogBlogs Adicionar esta notícia no Linkk

Introdução

Como trabalhamos com cursos é muito comum em nosso dia-à-dia perguntas e comparações entre nossos cursos de desenvolvimento de software e os de certificação oferecidos por algumas empresas.

Para isso vamos listar aqui as principais perguntas realizadas e suas respectivas respostas:

1 – Qual curso é melhor? Um curso prático para o mercado ou um curso de certificação?

A resposta para esse pergunta depende do momento da carreira que você está vivendo. Se você é um profissional com anos de experiência na tecnologia em questão e que já trabalhou com variados tipos de projetos, o ideal é fazer um curso de certificação onde você poderá aprender todos os detalhes, desde o B+A = BA até o mais avançado. Isso é possível porque você já tem experiência e está empregado, com certo tempo e dinheiro para fazer um curso mais longo de certificação.
Se você é um profissional que está começando a carreira (menos de 3 anos de experiência), ou então está migrando para uma nova tecnologia é recomendado um curso mais prático e focado para o mercado. Esse tipo de curso vai capacitá-lo a fazer as principais coisas exigidas pelo mercado em um menor tempo e com menor custo. Este é o perfil do curso da Accendis, que na prática, é complementar aos cursos de certificação focados para uma determinada prova da Microsoft. Nossos cursos abrangem múltiplas áres de começo, inclusive, áreas  de conhecimento que muitas vezes não são cobertas pelos cursos de certificação do mercado.

2 – Certificações realmente implicam em melhores salários e empregos?

Para algumas empresas as certificações são critérios decisivos para a tomada de decisão tanto no momento da contratação como na negociação de um aumento. Tais costumam ser também boas empresas para se trabalhar e possuem vários outros critérios quantitativos similares para admitir e aumentar o salário dos seus funcionários. Porém, para a grande maioria das empresas, a certificação não um fator tão determinante. O erro de muitos profissionais é focar apenas em conseguir certificações sem ter experiência de mercado nas tecnologias e isso pode ser percebido facilmente durante a análise de um currículo. Um analogia comum no mercado diz que “certificações são como a cereja do bolo”. E isso é uma grande verdade. O profissional deve ser experiente em todos os aspectos e finalmente, comprovar seu expertise com a certificação. Inclusive, as certificações mais recentes da Microsoft recomendam que o candidato tenha “working knowledge” na área da prova de interesse.

3 -Qual curso devo procurar se estou iniciando minha carreira e não consigo entrar no mercado de trabalho?

Com certeza você deve procurar um curso mais prático e dinâmico. Dessa forma dentro de poucos meses você estará apto a desempenhar as principais tarefas exigidas pelas empresas e conseqüentemente, a quantidade de oportunidades de emprego vai crescer consideravelmente. A Accendis, através de seus cursos, proporciona esta chance de aprendizado a preços realmente acessíveis.

4 – Qual a melhor forma para obter uma certificação?

Assim como perder peso, obter uma certificação não tem segredo a não ser sacrifício. Em outras palavras, ter experiência prática nas técnologias em questão e também estudar muito. O estudo é apenas um complemento para os detalhes mais técnicos que muitas vezes não se aprende no dia-a-dia. Para obter certificações, não é necessario fazer um curso de certificação, embora obviamente um curso de certificação focada para uma prova seja sempre uma boa oportunidade de aprendizado extra. É possível estudar pelo material da Microsoft. Hoje, grande parte das provas de desenvolvimento de software possuem livros correspondentes. Este material é de muita qualidade. Os livros contém CDs, questionários, simulações de prova, casos da vida real e cobrem o conteúdo de maneira mais focada. Uma ótima alternativa que também dá muito certo.

5 -  E o curso da Accendis? Compensa fazer?

O curso da Accendis possui o diferencial de contar com turmas pequenas (5 a 10 alunos). Os treinadores do curso são os fundadores da Accendis, experts e certificados em desenvolvimento de software com tecnologia Microsoft. As aulas são relativamente densas, com bastante conteúdo da vida real tirado de nossa própria experiência profissional e bastante conteúdo técnico. Nós visamos formar o aluno de forma que ele possa inclusive, colaborar conosco em projetos futuros. Com essa visão, o foco é ensinar o aluno de forma consistente, focando em deixá-lo apto a trabalhar nas mais diversas empresas atuando com os melhores padrões de desenvolvimento aceitos pela comunidade internacional. Como exemplo, o aluno já aprende noções gerais como organização dos projetos, estrutura de código, classes, camadas lógicas e físicas, noções de design de aplicações (UML, Banco de dados, ORM), LINQ, testabilidade de código, design patterns e muito mais. A turma poderá optar por C# ou Visual Basic. O curso é ministrado com o framework do .NET 3.5 SP1, com todas as melhorias trazidas pela última versão deste framework atualmente muito maduro.

Pessoal, por hoje é isso. Esperamos ter auxíliado vocês nesse tipo de decisão importante na carreira que são o cursos realizados e as certificações obtidas.

Um grande abraço à todos.

,
Adicionar aos Favoritos BlogBlogs Adicionar esta notícia no Linkk

Introdução

Criação e codificação de formulários é uma das principais tarefas no desenvolvimento de aplicativos ASP.NET. Normalmente as informações digitadas precisam ser validadas para que os dados processados ou armazenados na base sejam obrigatoriamente válidos.

Nos tempos do ASP clássico, boa parte das tarefas da validação eram realizadas através de JavaScript. Apenas os profissionais muito caprichosos tinham a cautela de realizar a validação TAMBÉM no servidor. Esse procedimento se faz necessário pela possibilidade do usuário desabilitar o uso de JavaScript em seu navegador e com isso não estar sujeito a validação.

No ASP.NET existem controles específicos para validação que fazem parte do Microsoft .NET Framework. Esses controles realizam a validação nos dois lados da aplicação: cliente e servidor. Nesse post falarei dos mais utilizados, porém se você precisar de mais alguma informação que não encontrou aqui acesse a página que explica os controles detalhadamente no MSDN: http://msdn.microsoft.com/pt-br/library/debza5t0.aspx

RequiredFieldValidator

O tipo de validação mais comum é fazer com que um determinado campo tenha conteúdo obrigatório. Para esse tipo de validação deve-se utilizar o controle RequiredFieldValidator.

Assim como todos os controles que vamos exemplificar nesse post, o RequiredFieldValidator se encontra no grupo Validation da Toolbox.

Para utilizar esse controle você deverá realizar as seguintes configurações:

Nome:
<asp:RequiredFieldValidator ID="rfvNome" runat="server"
     ControlToValidate="txtNome" ValidationGroup="Cadastro"
     ErrorMessage="O campo nome é obrigatório">
</asp:RequiredFieldValidator>
<br>
<asp:TextBox ID="txtNome" runat="server"
     ValidationGroup="Cadastro">
</asp:TextBox>
<br>
<asp:Button ID="btnSalvar" runat="server"
     Text="Salvar" ValidationGroup="Cadastro">
</asp:Button>

Como resultado desse exemplo você obterá uma validação de campo obrigatório atuando no campo Nome. Se o usuário apertar o botão Salvar sem ter informado algum valor no campo Nome a mensagem “O campo nome é obrigatório” será exibida.

RegularExpressionValidator

Digamos agora que nossa necessidade é verificar se a informação inserida em um campo atende a um critério pré-estabelecido.

Para solucionar esse problema utilizaremos o controle RegularExpressionValidator. Através de uma expressão regular que será configurada no controle faremos a validação da informação.

Em nosso exemplo vamos verificar se um endereço de e-mail é válido. Nesse exemplo para simplificar o código escrevi apenas o bloco do RegularExpressionValidator deixando de lado o TextBox e o Button que são necessários para o teste completo.

<asp:RegularExpressionValidator ID="revEmail" runat="server"
     ControlToValidate="txtEmail" ValidationGroup="Cadastro"
     ErrorMessage="Endereço de e-mail inválido."
     ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
</asp:RegularExpressionValidator>

O resultado desse exemplo é a validação do endereço de e-mail atuando no campo E-mail. Se a informação digitada não for válida após a validação do formulário será exibida a mensagem “Endereço de e-mail inválido”.

ValidationSummary

Em formulários muito extensos é muito comum que o desenvolvedor necessite exibir em um único lugar todas as mensagens de erro de validação. Para essa finalidade existe um controle chamado ValidationSummary.

A sintaxe para uso desse controle é bastante simples e prática:

<asp:ValidationSummary ID="vlsCadastro" runat="server"
     ValidationGroup="Cadastro" />

Com o uso desse controle, após a validação serão exibidos no local desejado todas as mensagens de erro de validação.

Esses são os três principais controles utilizados na validação de formulários ASP.NET. Como sempre, espero que esse post seja de grande ajuda para a comunidade de desenvolvedores .NET.

Um grande abraço a todos!

,
Adicionar aos Favoritos BlogBlogs Adicionar esta notícia no Linkk

Introdução

Durante as tarefas de desenvolvimento de aplicativos ASP.NET é muito comum a necessidade de recuperar variáveis relacionadas ao servidor e também aos caminhos físicos e relativos da página atual.

Devido a essa constante necessidade estou escrevendo esse post que explica as principais variáveis de servidor do objeto Request.

APPL_PHYSICAL_PATH

Utilizada para recuperar o caminho físico onde está configurado o servidor de aplicação.
Por exemplo: C:\Inetup\wwwroot\Sites

AUTH_USER

Recupera o nome do usuário autenticado.
Por exemplo: ACCENDIS\Aubry Maciel

PATH_INFO

Utilizado para recupear o endereço relativo desde a pasta inicial do servidor de aplicação até o nome da página atual.
Por exemplo: /sites/treinamentos/promocoes.aspx

PATH_TRANSLATED

Retorna o caminho físico completo do arquivo correspondente a página atual.
Por exemplo: C:\Inetpub\wwwroot\sites\treinamentos\promocoes.aspx

Exemplo de utilização

Para acessar os valores contidos nessas variáveis é muito simples. As variáveis estão armazenadas dentro do objeto Request dentro de uma lista chamada ServerVariables.

    Request.ServerVariables["PATH_INFO"]

Não citei e exemplifiquei todas as variáveis existentes pois a lista é um pouco extensa e nem todas tem a mesma relevância. Para complementar o post e permitir que você possa se aprofundar mais segue uma lista com todas a variáveis.

ALL_HTTP ALL_RAW APPL_MD_PATH
APPL_PHYSICAL_PATH AUTH_TYPE AUTH_USER
AUTH_PASSWORD LOGON_USER REMOTE_USER
CERT_COOKIE CERT_FLAGS CERT_ISSUER
CERT_KEYSIZE CERT_SECRETKEYSIZE CERT_SERIALNUMBER
CERT_SERVER_ISSUER CERT_SERVER_SUBJECT CERT_SUBJECT
CONTENT_LENGTH CONTENT_TYPE GATEWAY_INTERFACE
HTTPS HTTPS_KEYSIZE HTTPS_SECRETKEYSIZE
HTTPS_SERVER_ISSUER HTTPS_SERVER_SUBJECT INSTANCE_ID
INSTANCE_META_PATH LOCAL_ADDR PATH_INFO
PATH_TRANSLATED QUERY_STRING REMOTE_ADDR
REMOTE_HOST REMOTE_PORT REQUEST_METHOD
SCRIPT_NAME SERVER_NAME SERVER_PORT
SERVER_PORT_SECURE SERVER_PROTOCOL SERVER_SOFTWARE
URL HTTP_CONNECTION HTTP_ACCEPT
HTTP_ACCEPT_ENCODING HTTP_ACCEPT_LANGUAGE HTTP_HOST
HTTP_USER_AGENT

Espero que esse post ajude você em seus estudos!

Até a próxima. Um abraço a todos!

,
Adicionar aos Favoritos BlogBlogs Adicionar esta notícia no Linkk


Introdução

Para prosseguir com nossos estudos sobre o Entity Framework, vamos falar agora das operações básicas de select com as entidades do modelo de dados. Para seguir por esse exemplo, é necessário que você tenha lido o artigo anterior explicando como foram feitas etapas do projeto. Clique aqui para acessar o artigo inicial desta série.

Os testes unitários nesta fase do projeto não serão tão rigorosos, com inúmeras asserções e casos de falha – nosso objetivo é a praticidade e a velocidade no aprendizado.  Vale lembrar que é necessário um conhecimento básico de LINQ para conseguir progredir nestes exemplos. Neste artigo vamos aprender como fazer consultas básicas com WHERE e ORDER BY.

Executando comandos SELECT simples.

Nesta série de exemplos iremos criar testes que apenas buscam dados do banco de dados. Com isso teremos uma notável sensação de economia de tempo ao ver que é possível modificar à vontade o método de acesso a dados sem ter que ficar escrevendo tediosos comandos SQL.

Vamos relembrar do artigo passado como fizemos o nosso primeiro SELECT no banco. Se você seguiu o que foi sugerido no artigo passado, o banco deverá ter 3 registros na tabela Unidade:

using System;
using System.Collections.Generic;
using System.Linq;
using Accendis.Artigos.GerFac.DataModel.BusinessEntities;
using Accendis.Artigos.GerFac.DataModel.Config;
using NUnit.Framework;
 
namespace Accendis.Artigos.GerFac.UnitTests
{
    [TestFixture]
    public class UnidadeTest
    {
        [Test]
        public void ListarUnidades()
        {
            //Abrir uma conexão ao data model e implicitamente, abrir uma conexão com banco de dados
            //utilizando o Entity Framework. Utilizar o bloco using para que os recursos sejam fechados
            //após o termino da execução do bloco using.
            using (GerFacEntities entities = new GerFacEntities(AppConfiguration.ConnectionString))
            {
                //obter as entidades do banco de dados, materializar numa lista e realizar
                //as operações desejadas com a lista.
 
                List unidades = (from u in entities.Unidade select u).ToList();
                foreach (Unidade unidade in unidades)
                {
                    Console.WriteLine(string.Format("{0} - {1}", unidade.Nome, unidade.Descricao));
                }
                Assert.IsTrue(unidades.Count() &gt; 0);
            }
        }
    }
}

Vamos explicar em detalhes este método. Primeiramente, é criada uma classe do contendo o atributo [TestFixture]. Este atributo indica que esta classe poderá ter vários testes unitários. O atributo [Test]  indica que o método ListarUnidades() é um teste unitário. Como regra geral, as classes de teste não podem ter construtores customizados (com parâmetros) e os métodos de teste devem ser do estilo “void-no-args”, isto é, não podem retornar nada e não devem possuir parâmetros.

O bloco using mostra criação de uma instância de uma conexão ao contexto de dados do entity framework. Seria equivalente a preparar um SqlCommand. Ele usa como parâmetro uma connection string especial (que você vê em detalhes no seu app.config do projeto de testes). Neste caso, usamos uma classe e método estático que acessa o arquivo de configuração e nos retorna os dados desejados sem grande esforço.

Dentro do bloco using, podemos montar nossa consulta utilizando LINQ à vontade. Neste caso, fizemos um comando equivalente a um SELECT * na tabela Unidade do banco de dados. Nós poderíamos ter feito uso da palavra chave “var” e rescrito a linha de comando assim:

//Não utilizar este padrão!
var unidades = from u in entities.Unidade select u;

Este comando também funcionaria e então poderíamos realizar o mesmo foreach abaixo. Esta alternativa é válida em casos simples mas no caso genérico, onde é necessário retornar um objeto para as camadas superiores da aplicação, o ideal é fazer a materialização da lista chamando o método ToList(). Com uma lista formalizada, é possível realizar quais e quantas operações eu quiser.

O Entity Framework retorna as consultas do banco de dados de forma que elas sejam apenas enumeráveis uma única vez. Lembrem-se disso. Só é possível ler o resultado de uma mesma consulta uma única vez! Com a lista não – é possível ler quantas vezes quisermos. Nos códigos seguintes sempre usaremos este padrão, que é usar lista fortemente tipada e evitando ao máximo o uso do “var”. Aliás, o uso do “var” fora de consultas com LINQ é uma péssima prática de programação quando se fala em C#.

O foreach final percorre os registros recebidos e mostra na tela de resultados do plugin de testes unitários que o ReSharper oferece. Vale lembrar que esta ferramenta é opcional. E no caso geral, não é necessário imprimir os resultados de testes unitários, pois a idéia é que os mesmos sejam automáticos no futuro.

Um fato imporante é o pedaço do código: entities.Unidade – esta propriedade representa um objeto do tipo ObjectQuery. Esta classe na prática implementa IQueryable e IQueryable, que no fim das contas são as interfaces que quando implementadas fazem o trabalho de transformar queries do LINQ em comandos SQL possíveis de serem executados. Cada entidade possui uma propriedade criada de forma automática.

A última linha indica uma asserção. Todos os frameworks de testes unitários oferecem um conjunto de asserções para que o teste unitário faça a checagem se uma determinada condição é verdadeira ou falsa. Caso seja falsa, o teste falha e indica que houve uma falha de asserção.
Agora que já sabemos como é um teste unitário básico, vamos progredir com os exemplos de select simples.

        [Test]
        public void ListarUnidadesWhere()
        {
 
            using (GerFacEntities entities = new GerFacEntities(AppConfiguration.ConnectionString))
            {
 
                List unidades = (from u in entities.Unidade where u.Descricao == "Unidade 2" select u).ToList();
                foreach (Unidade unidade in unidades)
                {
                    Console.WriteLine(string.Format("{0} - {1}", unidade.Nome, unidade.Descricao));
                }
                Assert.IsTrue(unidades.Count() == 0);
 
                unidades = entities.Unidade.Where(u =&gt; u.Nome == "Unidade 2").ToList();
                foreach (Unidade unidade in unidades)
                {
                    Console.WriteLine(string.Format("{0} - {1}", unidade.Nome, unidade.Descricao));
                }
                Assert.IsTrue(unidades.Count() == 1);
            }
        }

O exemplo acima contém duas formas de se fazer uma consulta com where. A primeira usa a sintaxe chamada pela comunidade de “query syntax”, que se assemelha muito a consultas SQL comuns. A sua leitura é bem simples. A segunda consulta mostra como realizar a consulta utilizando Lambda Expressions entrada do método Where e sua sintaxe é conhecida como “fluent syntax / method syntax / full query syntax”. As consultas geradas pelo EF são as mesmas independentemente da sintaxe utilizada. Também é possível misturar sintaxes, pois no fim, o compilador analisa e monta as expressões lógicas necessárias.

Finalmente, vamos falar de ordenação e o que pode acontecer ao buscar uma única entidade do banco. Veja o teste abaixo:

        [Test]
        public void ListarUnidadesOrderbyNull()
        {
            using (GerFacEntities entities = new GerFacEntities(AppConfiguration.ConnectionString))
            {
                List unidades = (from u in entities.Unidade
                                          where u.Nome == "Unidade 2"
                                          orderby u.ID descending
                                          select u).ToList();
 
                Assert.IsTrue(unidades.Count() &gt; 0);
 
                Unidade unidadeInexistente = (from u in entities.Unidade
                                              where u.Nome == "Unidade 4"
                                              select u).First();
                Assert.IsNull(unidadeInexistente);
 
            }
        }

A primeira consulta contém um comando de ordenação simples e passará pela primeira asserção. Já a segunda consulta irá causar a exceção já que não temos a Unidade 4 no banco. Com isso acontece a seguinte falha:

Exceção no Resharper

Este erro é causado pelo fato de se buscar a primeira entidade de uma lista que não contém elementos. Este erro é evitável utilizando usando o método “FirstOrDefault” no lugar de “First”. Com este método, é possível retornar valores nulos da consulta sem problemas. O método corrigido fica assim:

        [Test]
        public void ListarUnidadesOrderbyNull()
        {
            using (GerFacEntities entities = new GerFacEntities(AppConfiguration.ConnectionString))
            {
                List unidades = (from u in entities.Unidade
                                          where u.Nome == "Unidade 2"
                                          orderby u.ID descending
                                          select u).ToList();
 
                Assert.IsTrue(unidades.Count() &gt; 0);
 
                Unidade unidadeInexistente = (from u in entities.Unidade
                                              where u.Nome == "Unidade 4"
                                              select u).FirstOrDefault();
 
                Assert.IsNull(unidadeInexistente);
 
            }
        }

Os comandos que buscam dados do banco podem ser mais complexos do que os exemplos acima. Porém, com o que já temos é possível realizar grande parte das buscas simples do dia-a-dia e provavelmente você estará fazendo este tipo de consulta 70% do tempo.

Encorajamos você a pesquisas os métodos que passaram a ser disponibilizados a partir da versão 3.5 do .NET. Navegue pelos métodos disponibilizados pelas entidades do modelo, tais como entidade.Unidde, entidade.Aluno e etc. Com esse background sua a experiência será cada vez maior.

No próximo artigo vamos falar sobre as operações de modificação de dados. Até já!

,
Adicionar aos Favoritos BlogBlogs Adicionar esta notícia no Linkk


Objetivos

Esta série de artigos visa mostrar com detalhes um exemplo relativamente complexo de aplicação do Entity Framework  em projetos do nosso dia-a-dia. Com isso, queremos demonstrar de forma imparcial os ganhos que obtivemos com a aplicação desta nova forma de trabalhar com dados que se revela muito promissora.

Esta série de artigos aplica-se aos desenvolvedores que usam .NET Framework 2.0 e gostariam de aprender ou convencer seus pares a adotar o .NET Framework 3.5. Estes exemplos são criados utilizando o Visual Studio 2008, banco de dados SQL Server 2005 e também, ferramentas auxiliares com o NUnit (sem custo) e ReSharper (possui custo – mas é opcional). Além disso, é necessário obter o Service Pack 1 do .NET Framework 3.5.

Introdução: Acesso a Dados

O acesso a dados é uma das tarefas mais corriqueiras de um desenvolvedor de aplicações empresariais comuns, como cadastros web por exemplo. Se você estiver utilizando a plataforma .NET, provavelmente cansou de escrever camadas de acesso a dados repetitivas para depois sofrer com mudanças no esquema, mudanças nas colunas, novos joins, erros de sintaxe e erros e compilação de comandos SQL.

Provavelmente você também já deve ter ouvido falar de várias ferramentas que tendem a ajudar na tarefa de mapear tabelas de bancos de dados relacionais em objetos autênticos no .NET. E provavelmente você acabou experimentando e usando com sucesso o NHibernate em sua mais recente versão, conseguindo acelerar radicalmente o tempo de criação da sua camada de acesso a dados. Entretanto, também sofreu com a criação dos trabalhosos arquivos de mapeamento do NHibernate. Com o tempo relativamente curto, nós, desenvolvedores, geralmente evitamos lidar com tecnologias completamente novas sem antes testar várias situações problemáticas. Sem o uso de NHibernate e sem o uso de ADO.NET clássico, evita-se a busca dos inúmeros outros fornecedores de soluções similares haja vista que cada tipo de ferramenta, paga ou não, necessita de um tempo de adaptação, power-users, treinamento de equipe e incorre em custos para o cliente ou projeto final, que custeia a curva de aprendizado do time.

Com o surgimento do framework 3.5, o mundo .NET sofreu uma revolução, não apenas uma evolução: foi introduzido o LINQ, que basicamente uniformiza o acesso a qualquer tipo de dados da atualidade. Neste release foi lançado também o Linq to SQL, que passou a ser um produto para simplificar radicalmente a acesso a dados para o SQL Server 2005. Muitas pessoas utilizaram e ainda utilizam o Linq to SQL. Entretanto, o LINQ to SQL não é considerado pela comunidade como uma solução corporativa pois é muito mais focado em acelerar o desenvolvimento de cadastros simples e também, só funciona com o SQL Server. Para exemplos de LINQ sugiro visitar estes links: Introdução ao LINQPágina do LINQ do MSDN e Primeiros Exemplos com LINQ .

O lançamento do Service Pack 1 do .NET introduziu o Entity Framework, que passou a ser a principal ferramenta de mapeamento objeto-relacional disponível para a comunidade .NET. É considerada uma solução corporativa e está no mainstream do desenvolvimento da Microsoft. Com os exemplos buscaremos mostrar como foi a adoção desta ferramenta, suas vantagens e desvantagens.  Com esta ferramenta, já é possível ignorar a necessidade o NHibernate, mesmo que este framework seja muito mais maduro que o seu concorrente. Isso se faz verdade pois com isso conseguimos diminuir o número de dependências externas. Outra vantagem é que não se cria a dependência de ferramentas não-Microsoft, argumento que é válido em muitas organizações que visam diminuir os supostos riscos de uma ferramenta open-source.

Preparação do Exemplo: Gerenciamento de Faculdade

Para começar a explicar como funciona o Entity Framework, vamos apresentar nosso exemplo. Este exemplo poderá ser a base de muitos outras postagens e portanto é bom que se entenda com calma quais são as especificações do sistema.

O sistema em questão é um sistema relativamente simples de controle de alunos, turmas e professores de uma faculdade. Os requerimentos sistema estão listados nos itens abaixo, de forma muito simplificada inicialmente:

1. O sistema suportará várias unidades (filiais) da faculdade.

2. A faculdade possui um grupo de disciplinas comum a todas as unidades.

3. Cada unidade possui uma turma distinta de uma dada disciplina. Isso permite que a mesma disciplina seja oferecida em diferentes unidades.

4. Cada unidade contém seus respectivos alunos. Os alunos não poderão utilizar mais do que uma unidade.

5. Cada aluno deverá conter um cadastro básico obrigatório e um cadastro não-básico opcional.

  1. Cadastro básico: Nome, Formas de Contato
  2. Cadastro não básico: Campos livres, decididos de acordo com cada unidade. Por exemplo, deverá ser possível montar um questionário sócio-econômico.

6. Cada professor pode ter uma ou mais turmas.

7. O sistema deverá suportará o cadastro de turmas. Cada turma é única em todo o sistema, independente de qual unidade ela pertença

  1. O sistema deverá suportar o envio de mensagens para os alunos da turma
  2. Deverá ser possível guardar informações do aluno em cada turma que estiver matriculado

8. Cada professor pode ministrar aulas em mais de uma unidade. Para os administradores de cada unidade, é necessário saber quem são os seus professores pois assim conseguem determinar os custos de estacionamento e honorários. A relação de professor x unidade existe independentemente de haver turmas para o professor.

Agora vamos citar alguns outros requisitos de negócio necessários para prosseguir com o exemplo:

1. O sistema deverá rodar em plataforma Web

2. O sistema poderá expor seus dados utilizando o padrão REST para Web Services.

Preparação do Exemplo: Modelagem dos dados

Considerando os requerimentos listados e levando em conta a necessidade de simplicidade do exemplo, vamos demonstrar a criação do modelo de dados através do uso de uma ferramenta que gera diagramas ORM. O ORM é uma ferramenta de engenharia de software conhecida no mercado que gera diagramas demonstrando a relação entre as entidades e complementa a notação UML ao especificar sistemas. Clique aqui para saber sobre ORM.

A ferramenta utilizada para gerar se chama Natural ORM Architect. Ela é Open Source e é exposta como um plugin do Visual Studio 2008. Trata-se de uma ferramenta completa e bem elaborada – quem dera se houvesse uma ferramenta similar totalmente open source para usar com UML! Clique aqui para obter esta ferramenta.

Para modelar um sistema geralmente a documentação é lida com os seguintes focos: buscar as entidades e buscar as relações/ações entre tais entidades. Tomando essas ações e aproveitando que temos um exemplo corriqueiro à disposição, consegue-se chegar no seguinte diagrama ORM:

Diagrama ORM representando as entidades deste exemplo

Diagrama ORM representando as entidades deste exemplo - clique pra aumentar todas as imagens deste artigo

Ao observar este diagrama devemos que lembrar:

1. Os retângulos são entidades formais – nossos “objetos” do domínio – de quem falamos. No caso, Unidade, Professor, Aluno e Turma.

2. Os fatos são as ligações entre as unidades. São os “verbos” de estado ou ação, que determinam como uma entidade se relaciona com outra. Estas relações podem ser de alguns tipos bem conhecidos: 1-1, 1-N, N-1. No nosso exemplo, a Unidade tem relação 1-N com Aluno, Aluno possui uma relação N-N com Turma, e assim vai.

3. O fato também pode ser “objetificado”. Isto é, a relação de alunos com turmas, apenas de ser N-N, é qualificada, isto é, a relação possui propriedades úteis. Isso ficará mais claro durante a criação do banco de dados. Quando um fato é objetificado, ele recebe um círculo no diagrama.

4. O “risco” roxo acima de cada fato significa a multiplicidade. O lado da relação que tiver o risco possui multiplicidade N.

5. A “bolinha” ao lado de cada relação indica que a presença da entidade na relação é obrigatória. Um exemplo de leitura neste caso seria: “Um Professor ministra em pelo menos uma ou mais Unidades. No caso inverso, Turma pode conter 0 ou mais alunos. Também, podemos ver que a Turma pode existir sem alunos.

6. Os termos colocados acima de cada relação demonstram como é efetivamente a relação de cada entidade. Isto é feito para facilitar a leitura do diagrama.

7. É possível estender o modelo acrescentando propriedades às entidades, como por exemplo, uma suposta classe “Endereço” à entidade Aluno.

É possível complicar muito mais este tipo de diagrama, pois é possível definir “constraints” no modelo, igualdades, “and”, “or” e vários outros tipos de condições entre as entidades. Embora Turma permita alunos de unidades diferentes, essa restrição é mais fácil de ser feita no software do que no banco de dados – não pode haver mistura de alunos de unidades diferentes.

Preparação do Exemplo: Criação do banco de dados

Muitas correntes de pensamento do mercado assumem que é interessante partir do modelo de dados final para depois criar o banco da dados – o objetivo disso é que não se crie uma aplicação já dependendo de um esquema pré-desenhado e muitas vezes, não tão bem pensando como poderia ser.

No nosso caso, temos um modelo misto. Vamos usar a modelagem acima para criar o banco e dados para depois, referenciar este esquema recém-criado no Entity Framework, pois este costuma ser o jeito mais prático de montar o modelo da aplicação.

Como a criação de tabelas é uma atividade corriqueira, vamos acelerar este processo e vamos montar as relações de forma que por enquanto, não haja nenhum tipo de ação ao alterar/remover linhas de um relacionamento entre tabelas, isto é, sem UPDATE ou DELETE action.

Esquema do banco de dados

Esquema do banco de dados

O modelo acima está um pouco simplificado em termos de número de campos por tabela. Com particularidades no design temos as seguintes observações:

1. Nas entidades Unidade, Professor, Aluno e AlunoNasTurmas foi criada a coluna [Detalhes]. Esta coluna é do tipo XML. Este é um tema que será detalhado mais para frente, mas já se pode adiantar que o uso deste tipo de coluna proporciona o uso de documentos XML neste tipo de coluna, com total suporte busca e manipulação de informação. No .NET, este tipo de dados é representando como String simples.

2. Foi acrescentado ao modelo a entidade DisciplinaOferecimento, que contém os tipos de semestre que são oferecidas as disciplinas. Ela indicará que uma disciplina é semestral, anual ou de férias, por exemplo.

3. A entidade Disciplina usa como chave o seu próprio código, que contém letras e números.

4. A relação entre Turma e Aluno é uma relação N-N qualificada. Ela contém várias propriedades interessantes e também possui um campo do tipo xml para armazenar outras informações não previstas neste momento, como por exemplo, a nota de cada prova.

O script completo da criação do banco e a solução do Visual Studio se encontram nos anexos listados no final deste artigo.

Preparação do Exemplo: Criação do modelo de dados com Entity Framework

Com o banco de dados construído, já temos condições de criar um modelo de dados consistente para nosso exemplo para uso no .NET. Para prosseguir com esse exemplo é necessário possuir o .NET Framework 3.5 SP1 instalado.

A princípio nossa solução será criada com um projeto contendo o modelo de dados e outro projeto contendo os testes unitários para podemos testar o modelo. Para facilitar a compreensão do processo siga os próximos passos:

1. Crie uma solução com um projeto Class Library. Crie uma pasta chamada BusinessEntities ou similar. Esta pasta irá conter o modelo de dados e todas as classes complementares ao modelo. Optamos pelo nome óbvio de GerFac para que o nome do projeto e de suas referências fique sucinto. Note que também eu já tenho no projeto o modelo ORM deste sistema, pois como foi dito antes, a ferramenta Natural ORM permite que se use o Visual Studio 2008 para desenhar os diagramas – os arquivos .orm são considerados como “Solution Items”.

2. Clique com o botão direito na pasta BusinessEntities e adicione um novo item do tipo “ADO.NET Entity Data Model”. Na tela subseqüente escolha “Generate from database”.

Criando uma nova solução.

Criando uma nova solução.

3. Conecte-se à base de dados contendo as tabelas do exemplo. Ao realizar a conexão bem sucedida, salve a conexão com o nome sugerido no App.Config.

Armazenando os dados da connection string no arquivo de configuração

Armazenando os dados da connection string no arquivo de configuração

4. Escolhas as tabelas criadas conforme o exemplo abaixo. Aceite o namespace padrão do modelo. Clique em Finish.

Escolhendo as tabelas do banco da dados

Escolhendo as tabelas do banco da dados

5. Se tudo correu bem, você conseguirá visualizar seu modelo de dados como mostra a figura abaixo. Também será possível ver as barras de ferramentas do Entity Framework. Analise o modelo. Note que algumas tabelas parecem ter sumido. Quando há uma relação N-N, a tabela de junção não é mostrada no modelo. Na prática, na relação de Unidade e Professor, a classe Unidade possui uma lista de [Professor] e a classe Professor possui uma lista de [Unidade].

Modelo de dados representado como classes em .NET

Modelo de dados representado como classes em .NET

6.  Salve e compile seu trabalho. Corrija eventuais erros. Analise o arquivo .designer do modelo. Esse arquivo .designer possui a representação de cada classe do modelo, assim como suas propriedades e métodos. Note também que esse arquivo sempre é gerado automaticamente – nunca mexa com ele diretamente.

7. O objetivo é tornar fácil o acesso à string de conexão do modelo de dados. A classe ConfigurationManager do .NET 2.0 facilita este processo. Vamos criar uma classe estática contendo um método estático que realize esta tarefa para nós. Para isso, crie uma pasta chamada Config e dentro desta pasta, crie uma classe chamada AppConfiguration. Adicione ao projeto uma referência ao assembly System.Configuration. Adicione o código abaixo à classe AppConfiguration:

using System.Configuration;
 
namespace Accendis.Artigos.GerFac.DataModel.Config
{
    public static class AppConfiguration
    {
        #region Public Properties
 
        /// Returns the connectionstring for the application.
        public static string ConnectionString
        {
            get
            {
                return ConfigurationManager.ConnectionStrings["GerFacEntities"].ConnectionString;
            }
        }
 
        #endregion
    }
}

8. Compile seu projeto e corrija eventuais erros. Ao final da tarefa sua solução deverá ficar como a figura abaixo:

Detalhe do projeto contendo o modelo de dados (referências e organização das pastas)

Detalhe do projeto contendo o modelo de dados (referências e organização das pastas)

Preparação do Exemplo: Primeiros Testes

Vamos começar a brincar com o nosso modelo de dados para verificar que o mesmo funciona. Para isso, adicione mais um projeto do tipo Class Library à solução. Denomine o projeto como UnitTests.

Referências do projeto de teste - observe a referência ao NUnit!

Referências do projeto de teste - observe a referência ao NUnit!

Para poder executar os teste unitários, é necessário instalar o NUnit em sua versão mais recente.  O NUnit é um framework para execução e automação de testes unitários open source e livre. É de longe a ferramenta de testes mais utilizada no mercado, embora exista ferramentas mais modernas e completas como por exemplo, o pacote de testes do Visual Studio Team System. O NUnit pode ser obtido a partir deste link.

Adicione uma referência ao projeto contendo o modelo de dados conforme a figura acima. Crie também uma classe chamada UnidadeTest, que será o lugar da primeira experiência prática com o Entity Framework. Copie o arquivo App.config do projeto DataModel para o projeto de testes. Isso é necessário para que o ConfigurationManager (criado por você anteriormente) que está no projeto DataModel consiga enxergar a connection string. Na prática, o projeto que chama o assembly DataModel injeta a string de conexão. Seja ele projeto de testes, Console Application, Windows ou Web. E essa injeção é possível com o uso do ConfigurationManager.

Uma ferramenta paga muito interessante para se trabalhar é o ReSharper. Ele é ótimo para verificar erros de codificação antes de compilar os dados mas uma das minhas funcionalidades favoritas é a execução de testes unitários. Esta ferramenta acelera muito a execução dos testes e permite ainda, que o teste escreva numa espécie de console. O ReSharper pode ser obtido a partir deste link. Vale a pena conferir!

Para terminar nosso teste básico, vamos listar e modificar entidades do tipo Unidade. Para isso faça o seguinte:

1. Crie um backup do banco completamente vazio.

2. Edite a tabela Unidade diretamente no SQL Server. Crie 3 unidades. Com isso teremos dados para retornar. Não se preocupe com o campo [Detalhes] neste momento.

Criando unidades para o teste

Criando unidades para o teste

3. Adicione referência ao assembly System.Data.Entity ao projeto. Se estiver o utilizando o ReSharper, ele tentará fazer isso por você utilizando um aviso de erro.

4. Vamos criar um primeiro teste que indica que somos capazes de buscar as unidades do banco de dados e mostrar na tela. Para alcançar esse objetivo adicione o seguinte código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Accendis.Artigos.GerFac.DataModel.BusinessEntities;
using Accendis.Artigos.GerFac.DataModel.Config;
using NUnit.Framework;
 
namespace Accendis.Artigos.GerFac.UnitTests
{
    [TestFixture]
    public class UnidadeTest
    {
        [Test]
        public void ListarUnidades()
        {
            //Abrir uma conexão ao data model e implicitamente, abrir uma conexão com banco de dados
            //utilizando o Entity Framework. Utilizar o bloco using para que os recursos sejam
            //liberados ao sair do bloco using.
            using (GerFacEntities entities = new GerFacEntities(AppConfiguration.ConnectionString))
            {
                //obter as entidades do banco de dados, materializar numa lista e realizar
                //as operações desejadas com a lista.
 
                List unidades = (from u in entities.Unidade select u).ToList();
                foreach (Unidade unidade in unidades)
                {
                    Console.WriteLine(string.Format("{0} - {1}",
                         unidade.Nome, unidade.Descricao));
                }
                Assert.IsTrue(unidades.Count() &gt; 0);
            }
        }
    }
}

5. Execute este teste. Se estiver com o ReSharper, haverá uma bolinha para clicar no lado de cada teste, como é mostrado na figura abaixo.  Escolha a opção “Run”. Veja o resultado do teste na janela “Unit Test Sessions”.

Menu do Resharper para chamar a execução do teste unitário.

Menu do Resharper para chamar a execução do teste unitário.

Resharper: Unit Test Explorer indicando o resultado da execução do teste unitário

Resharper: Unit Test Explorer indicando o resultado da execução do teste unitário

É isso aí! Se você conseguiu chegar até aqui parabéns! Com isso você já está utilizando o Entity Framework e tem acesso total ao modelo de dados. Nós te encorajamos a brincar com as entidades e suas relações. Note que por exemplo, a entidade Unidade possui várias propriedades do tipo EntityCollection, que na prática representa a sua lista de professores ou então, a sua lista de seus alunos.

Cabe ainda alguns comentários sobre este primeiro teste:

1. A grande vantagem de usar o Entity Framework é o uso do LINQ para realizar consultas. Com isso, eu consigo fazer consultas tanto a objetos como dados que estão no banco de dados.

2. Só é possível enumerar 1 vez os dados quando eles são trazidos do banco de dados. Para isso, é muito útil colocar o que é recebido numa lista genérica. Por isso é utilizando o método ToList().

3. O LINQ acrescenta vários métodos úteis a objetos comun do .NET como coleções genéricas e enumerações (tudo o que suporta o foreach). Com isso, é possível transformar enumerações em listas, dicionários, encontrar máximos, somas e muito mais. Vamos falar sobre isso nos próximos posts.

Aguarde os próximos posts desta série!

Atenciosamente,

Equipe Accendis – www.accendis.com.br

Clique aqui para baixar os anexos deste artigo.

,
Adicionar aos Favoritos BlogBlogs Adicionar esta notícia no Linkk

Hoje farei o primeiro POST técnico de nosso blog. Falarei sobre os PageMethods, um recurso bastante útil do AJAX no ASP.NET.

É muito comum a necessidade de realizar algum tipo de operação no lado servidor da aplicação sem renderizar novamente grandes blocos de código HTML. As vezes a idéia é atualizar apenas um pequeno valor que é calculado no servidor e exibí-lo em uma label, ou então atualizar um ícone de acordo com o status de uma operação.

Os PageMethods são chamadas de métodos no servidor utilizando Javascript. Para utilizá-los algumas pequenas configurações e implementações são necessárias. Para ilustrar os procedimentos vou utilizar um exemplo bem simples. Nosso exemplo consiste na necessidade de realizar a soma de dois números. Apesar de ser uma operação bastante simples e que poderia ser realizada apenas através de Javascript, vamos imaginar que essa soma só pudesse ser realizada no lado servidor da aplicação.

1 – Formulário

Nosso formulário contém apenas duas caixas de texto, um botão e uma span (controle onde será exibido o resultado do cálculo).

<form id="form1" runat="server">
    <asp:ScriptManager runat="server" EnablePageMethods="true">
    </asp:ScriptManager>
    <div>
        <p>
            Primeiro número:<br />
            <input type="text" id="numero1" />
        </p>
        <p>
            Segundo número:<br />
            <input type="text" id="numero2" />
        </p>
        <p>
            <input type="button" value="Somar"
                      onclick="javascript: somar();" />
        </p>
        <p>
            Resultado:<br />
            <span id="resultado"></span>
        </p>
    </div>
</form>

É importante atentar para a necessidade de existir um ScriptManager na página e que o mesmo tenha habilitado o uso de PageMethods.

<asp:ScriptManager runat="server" EnablePageMethods="true">
</asp:ScriptManager>

2 – Operação no codebehind

Agora criaremos no codebehind o método responsável por realizar a soma dos números. Para que tudo funcione corretamente não se pode esquecer o atributo WebMethod que deve ser colocado logo acima do método. Outro detalhe importante é que o método deve ser estático para que possa ser acessado através de Javascript.

1
2
3
4
5
6
7
8
9
10
11
/// <summary>
/// Realiza a soma de dois números.
/// </summary>
/// <param name="numero1">Primeiro número.</param>
/// <param name="numero2">Segundo número.</param>
/// <returns>Resultado da soma.</returns>
[WebMethod]
public static string Somar(int numero1, int numero2)
{
    return (numero1 + numero2).ToString();
}

3 – Métodos no cliente

Para controlar os eventos e atualizar o resultado da operação na página é necessário que sejam implementados alguns métodos em javascript. Em nosso exemplo teremos 3 métodos:

  • somar: método que é chamado quando o botão Somar é clicado. Esse método é responsável por recuperar os valores do formulário e realizar a chamada da operação no servidor.
  • OnSucceed: é chamado através de callback automaticamente quando a operação no servidor for realizada com sucesso.
  • OnFailed: é chamado através de callback automaticamente quando ocorrer falha na operação executada no servidor.

Abaixo segue o código das três funções em javascript responsáveis pelo controle da tela:

// Realiza a soma dos dois números informados na tela.
function somar() {
    txtNumero1 = document.getElementById('numero1');
    txtNumero2 = document.getElementById('numero2');        
    PageMethods.Somar(txtNumero1.value, txtNumero2.value,
                                OnSucceeded, OnFailed);
}
 
// Executado através de callback em caso de sucesso.
function OnSucceeded(result, userContext, methodName) {
    resultado = document.getElementById('resultado');
    resultado.innerHTML = result;
}
 
// Executado através de callback em caso de falha.
function OnFailed(error, userContext, methodName) {
    resultado = document.getElementById('resultado');
    resultado.innerHTML = 'Erro ao executar soma';
}

O resultado desse exemplo é simples. Sempre que o botão Somar for pressionado, o método somar recupera o valor dos dois números informados no formulário, realiza a requisição ao método Somar no servidor e através do callback atualiza o conteúdo da SPAN resultado.

Espero que esse post possa auxiliar e agregar conhecimentos aqueles que acompanham nosso blog.

Agradeço a todos pelo apoio e visitas.

Um grande abraço. Até a próxima.

,
Adicionar aos Favoritos BlogBlogs Adicionar esta notícia no Linkk