Quantcast
Channel: José Carlos Macoratti
Viewing all 293 articles
Browse latest View live

.NET – Padrão Repository e Unit of Work com EF 6 (revisitado)

$
0
0

Neste artigo vou recordar os conceitos relacionados com o padrão Repositório e padrão Unit Of Work e sua implementação com o Entity Framework 6.x.

O padrão de projeto Repository acrescenta uma camada de abstração no topo da camada de consultas e ajuda eliminar a lógica duplicada na implementação do código de suas consultas ao modelo de entidades.

Foi Martin Fowler quem definiu o padrão Repository no seu livro – Patterns of Enterprise Application Architecture – da seguinte forma: “Intermedeia entre o domínio e as camadas de mapeamento de dados usando uma interface de coleção para acessar objetos de domínio” (numa tradução livre minha mesmo).

O que é o padrão Unit Of Work?

Unit Of Work ou Unidade de Trabalho é um padrão de projeto e, de acordo com Martin Fowler, o padrão de unidade de trabalho “mantém uma lista de objetos afetados por uma transação, coordena a escrita de mudanças e trata possíveis problemas de concorrência”.

Este padrão está presente em quase todas as ferramentas OR/M atuais (digo quase, pois não conheço todas) e geralmente você não terá que criar a sua implementação personalizada a menos que decida realmente fazer isso por uma questão de força maior.

Dessa forma, a interface ITransaction no NHibernate, a classe DataContext no LINQ to SQL e a classe DbSet no Entity Framwork são exemplos de implementações do padrão Unit of Work (até o famigerado DataSet  pode ser usado como uma Unit of Work).

Então, o padrão Unit of Work pode ser visto como um contexto, sessão ou objeto que acompanha as alterações das entidades de negócio durante uma transação, sendo também responsável pelo gerenciamento dos problemas de concorrência que podem ocorrer oriundos dessa transação.

Existem várias razões para implementar um repositório e a sua própria unidade de trabalho, como efetuar logs, tracing, gerenciar as transações, promover testabilidade em seu sistema, entre outras.

E, quando você for fazer isso, você deve estar certo de estar fazendo da forma correta.

Neste artigo, eu apresento como implementar o padrão Repository e Unit of Work de forma correta evitando muitos problemas em sua aplicação.

Recursos usados: Visual Studio Community 2015

Implementando o padrão Repositório: a forma ingênua

Você vai encontrar muitos artigos na web que tratam da implementação do padrão Repository. Uma boa parte deles utiliza a seguinte abordagem:

  • Definir uma interface para cada Repositório;
  • Fazer a implementação concreta do Repositório;
  • Injetar (via construtor) as implementações do Repositório concreto – (usando um Framework como o Ninject).

Para exemplificar, suponha que temos as entidades Cliente e Produto e a classe AppContexto, que representa o nosso contexto, em uma aplicação ASP .NET MVC (apenas para nos situarmos). Nessa abordagem temos:

1. Definição da interface para cada Repositório:

public interface IClienteRepository
{
   Cliente GetByID(int clienteID);
   Cliente GetTodos();
   void Salvar(Cliente cliente);
}
public interface IProdutoRepository
{
   Produto GetByID(int produtoID);
   Produto GetTodos();
   void Salvar(Produto produto);
}

2. Implementação concreta do Repositório e Injeção da dependência no construtor:

public class ClienteRepositorio : IClienteRepository
 {
     AppContexto _contexto = null;
        public ClienteRepositorio(AppContexto contexto)
        {
            _contexto = contexto;
        }

        public Cliente GetByID(int clienteID)
        {
            throw new NotImplementedException();
        }

        public Cliente GetTodos()
        {
            throw new NotImplementedException();
        }
        public void Salvar(Cliente cliente)
        {
            throw new NotImplementedException();
        }
 }
 public class ProdutoRepositorio : IProdutoRepository
  {
     AppContexto _contexto = null;
        public ProdutoRepositorio(AppContexto contexto)
        {
            _contexto = contexto;
        }
        public Produto GetByID(int produtoID)
        {
            throw new NotImplementedException();
        }
        public Produto GetTodos()
        {
            throw new NotImplementedException();
        }
        public void Salvar(Produto produto)
        {
            throw new NotImplementedException();
        }
    }

Essa implementação é funcional e aparentemente aderente às boas práticas, mas ela esconde alguns problemas.

  • Primeiro problema: se sua aplicação tiver (é quase certo que isso ocorra em uma aplicação de produção) muitas entidades relacionadas, você terá que definir uma interface e uma classe concreta por entidade para a qual deseja definir o seu repositório.
  • Segundo problema: isso fará com que você tenha código duplicado espalhado pela sua aplicação.
  • Terceiro problema: quando você injeta cada repositório individualmente, em cada controlador, você acaba criando múltiplas instâncias do seu contexto (leia-se DbContext), o que pode causar problemas de concorrência.

Em suma, cada repositório vai precisar criar uma instância do contexto (DbContext no nosso caso, que estamos usando o Entity Framework) para poder interagir com o banco de dados e isso pode trazer problemas de acesso concorrente aos dados.

Uma forma de contornar os problemas e criar um repositório genérico e implementar o padrão Unit of Work.

Na Figura 1 temos o problema do código duplicado na abordagem 1 interface/1 classe concreta, já na Figura 2, a abordagem do Repositório Genérico:

net_uow10
Figura 01
Figura 02
Figura 02

Na Figura 3 temos o problema das múltiplas instâncias do DbContext. Na Figura 4, temos a adoção do padrão Unit Of Work para resolver o problema:

Figura 03
Figura 03
Figura 04
Figura 04

Em uma aplicação ASP .NET MVC usando Entity Framework, geralmente os repositórios serão injetados em cada controlador, o que acaba anulando os benefícios da Unit of Work, pois para cada request específico, cada chamada a um método, o Action do Controlador acessa múltiplos repositórios e acaba criando múltiplas instâncias do Unit of Work; o que acaba chamando o método SaveChanges (Commit) múltiplas vezes; o que causa muitas idas e vindas ao seu banco de dados através de múltiplas transações – e esse não é o comportamento esperado.

Nota: A Microsoft define o DbContext assim: “Representa uma combinação dos padrões Unit-of-Work e Repositório que permite consultar o banco de dados e agrupar as alterações como uma unidade”.

Implementando o padrão Repositório: a forma mais correta

Pois bem, para resolver esses problemas temos que adotar uma abordagem mais acurada que envolve a criação de um repositório genérico para evitar a duplicação de código e a implementação do padrão Unit Of Work para garantir que todos os repositórios utilizem a mesma instância do contexto.

Para concluir a primeira parte deste artigo, vou apresentar uma implementação para o Repositório Genérico chamada IRepositorio<T> onde T representa uma classe/entidade do domínio da aplicação:

public interface IRepositorio<T> where T : class
    {
        IEnumerable<T> GetTudo(Expression<Func<T, bool>> predicate = null);
        T Get(Expression<Func<T, bool>> predicate);
        void Adicionar(T entity);
        void Atualizar(T entity);
        void Deletar(T entity);
        int Contar();
    }

Na implementação do nosso repositório genérico, temos um tipo abstrato (interface) contendo operações atômicas básicas que serão usadas em nossa aplicação para interagir com todos os repositórios.

A seguir, temos a implementação da interface IRepositorio<T> pela classe concreta Repositorio<T>:

public class Repositorio<T> : IRepositorio<T> where T : class
    {
        private AppContexto m_Context = null;
        DbSet<T> m_DbSet;
        public Repositorio(AppContexto context)
        {
            m_Context = context;
            m_DbSet = m_Context.Set<T>();
        }
        public IEnumerable<T> GetTudo(Expression<Func<T, bool>> predicate = null)
        {
            if (predicate != null)
            {
                return m_DbSet.Where(predicate);
            }
            return m_DbSet.AsEnumerable();
        }
        public T Get(Expression<Func<T, bool>> predicate)
        {
            return m_DbSet.FirstOrDefault(predicate);
        }
        public void Adicionar(T entity)
        {
            m_DbSet.Add(entity);
        }
        public void Atualizar(T entity)
        {
            m_DbSet.Attach(entity);
            ((IObjectContextAdapter)m_Context).ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
        }
        public void Deletar(T entity)
        {
            m_DbSet.Remove(entity);
        }
        public int Contar()
        {
            return m_DbSet.Count();
        }
    }

A implementação da interface IRepostiorio<T> é feita pela classe concreta Repositorio<T>, que delega todas as chamadas para o contexto associado (DBContext).

No construtor solicitamos uma instância do DbContext que será fornecida pela Unit of Work – aqui, para aplicações mais simples, poderíamos usar diretamente o repositório no controlador.

A próxima etapa é implementar a Unit of Work para poder encapsular os repositórios.

Aguarde!


Visual Basic 6 – Conexão com MySQL via ODBC – Parte 02

$
0
0

No artigo de hoje, vou mostrar como realizar a conexão com o banco de dados MySQL usando um driver ODBC em uma aplicação Windows, usando a linguagem Visual Basic 6.

Na primeira parte do artigo definimos o banco de dados e a tabela do MySQL, instalamos o driver ODBC e criamos uma fonte de dados ODBC.

Agora já temos tudo pronto para poder acessar os dados no MySQL usando o Visual Basic 6.

Vamos, então, definir o projeto VB6 e acessar os dados em um projeto Windows Forms usando os componentes ADODC e DataGrid.

Recursos usados:

Criando o projeto no Visual Basic 6

Abra o Microsoft Visual Basic 6, selecione o projeto do tipo STANDARD EXE e clique no botão Abrir:

vb6_prj1

Salve o projeto como MySQL_ODBC e o formulário padrão como frmConexaoMySQL.

No menu Project, clique em Components (CTRL + T) e na janela Components, selecione o componente: Microsoft ADO Data Control 6.0 (OLEDB):

vb6_pgsql18

Você deverá ver na ToolBox o ícone do componente Adodc. A partir da ToolBox, inclua os seguintes controles no formulário:

  • 3 Labels
  • 3 TextBox – Text1, Text2 e Text3
  • 1 Adodc – Adodc1

Defina o leiaute do formulário conforme mostra a figura abaixo:

vb6_mysql14

Agora vamos configurar o componente Adodc1. Primeiro, clique com o botão direito do mouse sobre o componente e a seguir clique em ADODC Properties. Depois, marque a opção – Use ODBC Data Source Name – e selecione a nossa fonte de dados – MySQL_DNS_32; a seguir, clique no botão Aplicar e depois em OK:

vb6_mysql15

A seguir selecione o controle Adodc1 e defina as seguintes propriedades a partir da janela de Propriedades do controle:

vb6_mysql16

  • Caption = Northwind – Clientes
  • CommandType = 8 – adCmdUnknown
  • ConnectionString = DSN=MySQL_DNS_32

Ainda na janela de propriedades, clique em RecordSource e defina as propriedades Command Type e Command Text conforme mostra a figura abaixo:

vb6_mysql17

Note que definimos o comando SQL – Select * from Customers – que irá acessar a tabela Customers e retornar todos os registros.

A seguir, clique em Aplicar e depois em OK.

Agora podemos selecionar a primeira caixa de texto – Text1 -, onde vamos exibir o código do projeto e pressionar F4 para exibir a janela de propriedades.

Na janela de propriedades, defina a propriedade DataSource atribuindo o controle Adodc1 e, a seguir, defina a propriedade DataField igual a CustomerID, que é o campo da tabela que vamos exibir:

vb6_mysql18

Repita o procedimento acima para a segunda caixa de texto – Text2 -, definindo os valores para DataSource e DataField conforme a figura abaixo:

vb6_mysql19

E para concluir, repita o procedimento acima para a terceira caixa de texto – Text3 -, definindo os valores para DataSource e DataField, conforme a figura abaixo:

vb6_mysql1a

Pronto! Agora é só alegria…

Executando o projeto, iremos obter o seguinte resultado:

vb6_mysql1b

Podemos também exibir todos os registros da tabela usando o componente DataGrid. Para isso, vamos incluir o componente em nosso projeto.

No menu Project, clique em Components (CTRL + T); na janela Components, selecione o componente: Microsoft DataGrid Control 6.0 (OLEDB).

vb6_pgsql1h

A seguir, inclua o componente a partir da ToolBox e no formulário do projeto:

vb6_mysql1c

Selecione o componente DataGrid1 no formulário e pressione F4.

Na janela de propriedades, defina a propriedade DataSource do controle DataGrid1 para Adodc1:

vb6_mysql1d

Agora execute o projeto novamente e você deverá obter o seguinte resultado:

vb6_mysql1e

E assim acabamos de concluir o acesso ao banco de dados MySQL usando um driver ODBC no Visual Basic 6.

Pegue o projeto completo aqui: Projeto_VB6-conexao_MySQL.zip

Mensagem do anunciante:

Cloud on Demand Locaweb: A partir de R$ 0,07/hora, você contrata instâncias pós-pagas, em menos de 15 minutos e paga apenas o que usar! Confira!

.NET – Padrão Repository e Unit of Work com EF 6 (revisitado) – Parte 02

$
0
0

Neste artigo vou recordar os conceitos relacionados ao padrão Repositório e ao padrão Unit Of Work e sua implementação com o Entity Framework 6.x.

Na primeira parte deste artigo, mostrei a implementação ingênua e a uma das formas corretas de implementar o padrão repositório. Hoje, vou focar no padrão Unit of Work.

Qual a utilidade em usar o padrão Unit Of Work ?

  • Gerenciar as transações;
  • Ordenar o CRUD no banco de dados;
  • Impedir a concorrência (duplicação de atualizações);
  • Usar somente uma instância do contexto por requisição.

Assim, implementar corretamente o padrão Unit Of Work, evita o problema de criar múltiplas instâncias da unidade de trabalho e permite realizar múltiplas chamadas ao método Commit(), que persiste as informações em uma transação.

O objetivo é tornar a nossa camada de domínio baseada no Unit-of-Work e no Repositório mais simples e limpa o possível, usando o mínimo de tipos e tornando-a realmente desacoplada e extensível.

Recursos usados: Visual Studio Community 2015

Implementando o padrão Unit of Work : a forma correta

Tomando como base o cenário onde temos as entidades Cliente e Produto e a classe AppContexto, que representa o nosso contexto, em uma aplicação ASP .NET MVC (apenas para nos situarmos).

A classe AppContexto possui o código abaixo neste cenário:

public class AppContexto : DbContext
 {
        public virtual DbSet<Cliente> Clientes { get; set; }
        public virtual DbSet<Produto> Produtos { get; set; }
 }

Agora nessa abordagem temos a seguinte implementação da Unit Of Work:

1. Definição da interface Unit Of Work: IUnitOFWork:

public interface IUnitOfWork
  {
        IRepositorio<Cliente> ClienteRepositorio { get; }
        IRepositorio<Produto> ProdutoRepositorio { get; }

        void Commit();
  }

Definimos um tipo Unit of Work abstrato (Interface) contendo todos os repositórios genéricos fazendo parte da unidade de trabalho com um único método Commit(), usado para persistir todas as alterações feitas nos repositórios para o correspondente banco de dados.

Assim, a Unit-of-Work encapsula os repositórios e é ela quem gerencia a persistência das alterações na base de dados.

Agora para cada provedor de dados precisamos criar uma única implementação concreta da nossa abstração IUnitOfWork e IRepositorio independente do número de repositórios.

2. Implementação concreta de IUnitOfWork

public class UnitOfWork : IUnitOfWork, IDisposable
  {
        private AppContexto _contexto = null;
        private Repositorio<Cliente> clienteRepositorio = null;
        private Repositorio<Produto> produtoRepositorio = null;
        public UnitOfWork()
        {
            _contexto = new AppContexto();
        }
        public void Commit()
        {
            _contexto.SaveChanges();
        }
        public IRepositorio<Cliente> ClienteRepositorio
        {
            get
            {
                if (clienteRepositorio == null)
                {
                    clienteRepositorio = new Repositorio<Cliente>(_contexto);
                }
                return clienteRepositorio;
            }            
        }
        public IRepositorio<Produto> ProdutoRepositorio
        {
            get
            {
                if (produtoRepositorio == null)
                {
                    produtoRepositorio = new Repositorio<Produto>(_contexto);
                }
                return produtoRepositorio;
            }
        }
       private bool disposed = false;
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    _contexto.Dispose();
                }
            }
            this.disposed = true;
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
 }

Esta classe implementa a IUnitOfWork, onde vemos que o construtor cria uma instância do contexto que aciona o correspondente DbSet (veja a classe AppContexto).

Se você quiser fazer a injeção de dependência, basta definir outro construtor que recebe o contexto como parâmetro.

Agora observe que nas propriedades ClienteRepositorio e ProdutoRepositorio estamos instanciando seus respectivos repositórios e passando como parâmetro uma instância do contexto garantindo, assim todos os repositórios usarão o mesmo DbContext.

Para usar a implementação em sua aplicação, no nosso caso uma aplicação ASP .NET MVC, basta criar o respectivo controlador (para o exemplo seria o ClienteController) e definir a instância do UnitOfWork ou injetar via construtor:

public class ClienteController : Controller
  {
       private readonly UnitOfWork uow;
       public BlogController()
        {
            uow = new UnitOfWork();
        }
        //usado para injetar via construtor
        public BlogController(UnitOfWork unitOfWork)
        {
            uow = unitOfWork;
        }
        // GET: Cliente
        public ActionResult Index()
        {
             List<Cliente> clientes = uow.ClienteRepositorio.GetTudo().ToList();
             return View(clientes);
        }
        ....
    }

Pegue uma aplicação completa de blog que mostra a implementação feita neste artigo: MacBlog.zip

ASP .NET MVC – CRUD com Fluent NHibernate – Parte 01

$
0
0

Neste artigo, vou mostrar como realizar as operações CRUD em uma aplicação ASP .NET MVC usando o NHibernate e realizando o mapeamento com o Fluent NHibernate.

Se você já chegou a usar o NHibernate e não conhece o Fluent NHibernate, deve saber que gerar os arquivos de mapeamento (.hbm) dá muito trabalho e é uma tarefa que esta sujeita a erros. Assim, se esse era um quesito que o desmotivava a usar o NHibernate, fique sabendo que agora você não tem mais essa desculpa.

O Fluent NHibernate chegou (há um bom tempo, por sinal) para auxiliar a realização dos mapeamentos das suas entidades com o seu banco de dados. Com ele podemos realizar o mapeamento via código sem ter que usar os arquivos .hbm.

Dessa forma, o Fluent NHibernate oferece uma alternativa aos arquivos de mapeamento XML padrão do NHibernate. Ao invés de escrever documentos XML (arquivos .hbm.xml), o Fluent NHibernate permite que você escreva mapeamentos fortemente tipados usando código C# ou VB .NET. Isso permite um fácil refatoramento, melhora a legibilidade e o código fica mais conciso.

Apenas para comparar, veja abaixo um exemplo de um arquivo de mapeamento .hbm gerado e sua contrapartida usando o Fluent NHibernate:

(fonte: https://github.com/jagregory/fluent-nhibernate/wiki/Getting-started)

Arquivo XML .hbm:

<?xml version="1.0" encoding="utf-8" ?>  
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"  
  namespace="QuickStart" assembly="QuickStart">  
  <class name="Cat" table="Cat">  
    <id name="Id">  
      <generator class="identity" />  
    </id>  
    <property name="Name">  
      <column name="Name" length="16" not-null="true" />  
    </property>  
    <property name="Sex" />  
    <many-to-one name="Mate" />  
    <bag name="Kittens">  
      <key column="mother_id" />  
      <one-to-many class="Cat" />  
    </bag>  
  </class>  
</hibernate-mapping>

Código Fluent NHibernate equivalente:

public class CatMap : ClassMap<Cat>
{
  public CatMap()
  {
    Id(x => x.Id);
    Map(x => x.Name)
      .Length(16)
      .Not.Nullable();
    Map(x => x.Sex);
    References(x => x.Mate);
    HasMany(x => x.Kittens);
  }
}

O Fluent NHibernate pode ser baixado neste link, ou se preferir via Nuget.

Neste artigo, eu vou criar um projeto ASP .NET MVC  (linguagem C#) e usar o NHibernate e o Fluent NHibernate para definir as classes POCO do mapeamento via código para criar as tabelas em tempo de execução no SQL Server 2012.

Recursos usados:

Objetivos:

  • Usar os recursos do NHibernate e Fluent NHibernate e realizar o CRUD em uma aplicação ASP .NET MVC

Aprendizado:

  • Realizar o CRUD em uma aplicação ASP .NET MVC usando a linguagem C#
  • Criar um banco de dados SQL Server 2012 Express
  • Criar as entidades que fazem partem do modelo
  • Realizar o mapeamento ORM usando o Fluent NHibernate
  • Criar a classe NHibernateHelper e definir a SessionFactory
  • Criar o controlador, definir os métodos e criar as views para realizar o CRUD

Criando o projeto no VS Community

Abra o VS Community 2015 e clique em New Project. A seguir, selecione Visual C# -> Web -> ASP .NET Web Application.

Informe o nome CRUD_FluentNHibernate e clique no botão OK:

mvc_crudnhb11

Selecione o template Empty e marque a opção MVC, sem autenticação, conforme figura a seguir:

mvc_crudnhb12

Vamos agora incluir a referência no projeto ao NHibernate e ao Fluent NHibernate via Nuget. Para isso, no menu Tools, clique em Nuget Manager Package e, a seguir, em Manage Nuget Packages for Solution.

Localize o pacote do FluentNhibernate e instale-o no projeto:

mvc_crudnhb13

Definindo a fonte e o modelo de dados

Para este exemplo, eu vou usar o banco de dados chamado Cadastro.mdf e a tabela Alunos que possui a seguinte estrutura:

Estrutura da Tabela Aluno:

mvc_crudnhb14

Script SQL para gerar a tabela Alunos:

USE [Cadastro]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Alunos](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Nome] [nvarchar](50) NOT NULL,
	[Email] [nvarchar](100) NOT NULL,
	[Curso] [nvarchar](50) NULL,
	[Sexo] [nvarchar](50) NULL,
 CONSTRAINT [PK_Alunos] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Aproveite para incluir alguns dados na tabela alunos para efeito de testes.

Agora, vamos criar na pasta Models do projeto a nossa classe de domínio que é uma classe POCO que representa um aluno.

Clique com o botão direito sobre a pasta Models e, a seguir, em Add Class, informe nome Aluno e digite o código abaixo para a classe Aluno:

public class Aluno
 {
            public virtual int Id { get; set; }
            public virtual string Nome { get; set; }
            public virtual string Email { get; set; }
            public virtual string Curso { get; set; }
            public virtual string Sexo { get; set; }
 }

Vamos criar agora a nossa classe de mapeamento usando o FluentNHibernate que mapeará a nossa classe de modelo(Aluno) para a tabelaAlunos do banco dados.

Clique com o botão direito sobre a pasta Models e, a seguir, em Add Class, informe nome AlunoMap e digite o código abaixo para a classe:

using FluentNHibernate.Mapping;
namespace Crud_FluentNHibernate.Models
{
    class AlunoMap : ClassMap<Aluno>
    {
        public AlunoMap()
        {
            Id(x => x.Id);
            Map(x => x.Nome);
            Map(x => x.Email);
            Map(x => x.Curso);
            Map(x => x.Sexo);
            Table("Alunos");
        }
    }
}

Neste código mapeamos as propriedades definidas na classe Aluno para os campos da tabela Alunos definida na propriedade Table do Fluente NHibernate.

Usamos aqui as expressões lambdas que são funções e podem conter expressões e declarações que são usadas para criar delegates e árvores de expressões, onde o tipo das variáveis não precisam ser declarados, visto que elas usam métodos anônimos.

Para saber mais sobre expressões lambdas, veja o meu artigo: .NET – Expressões Lambdas

Vamos, agora, criar a classe NHibernateHelper que irá realizar a conexão com o banco de dados SQL Server.

Clique com o botão direito sobre a pasta Models e, a seguir, em Add Class, informe nome NHibernateHelper e digite o código abaixo para a classe:

using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Tool.hbm2ddl;
namespace Crud_FluentNHibernate.Models
{
    public class NHibernateHelper
    {
        public static ISession OpenSession()
        {
            ISessionFactory sessionFactory = Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2012
                  .ConnectionString(@"Data Source=(localDB)\v11.0;Initial Catalog=Cadastro;Integrated Security=True")
                              .ShowSql()
                )
               .Mappings(m =>
                          m.FluentMappings
                              .AddFromAssemblyOf<Aluno>())
                .ExposeConfiguration(cfg => new SchemaExport(cfg)
                                                .Create(false, false))
                .BuildSessionFactory();
            return sessionFactory.OpenSession();
        }
    }
}

No código acima, criamos o método OpenSession, que será responsável por disponibilizar uma session que representa o nosso contexto. Nesta classe, temos a string de conexão com o banco de dados Cadastro.mdf do SQL Server 2012.

Na segunda parte do artigo, vamos definir o controlador e os métodos para realizar o CRUD.

Visual Studio Code – Apresentando o editor multiplataforma da Microsoft

$
0
0

A Microsoft lançou em 2015 um editor de código destinado ao desenvolvimento de aplicações web chamado Visual Studio Code (daqui em diante, apenas VSCode).

Trata-se de uma ferramenta leve e multiplataforma que esta disponível para Windows, Mac OS e Linux, sendo executada nativamente em cada plataforma.

O VSCode atende a uma quantidade enorme de projetos (ASP .NET, Node.js) e oferece suporte para mais de 30 linguagens de programação, como JavaScript, C#, C++, PHP, Java, HTML, R, CSS, SQL, Markdown, TypeScript, LESS, SASS, JSON, XML e Python, assim como muitos outros formatos de arquivos comuns.

Ele é gratuito e open source, com seu código disponibilizado no GitHub, e isso permite que você contribua com seu desenvolvimento.

Você pode baixar a versão correspondente do VSCode para a sua plataforma neste link : https://code.visualstudio.com/download.

A seguir, um resumo dos principais recursos desta ferramenta (retirada de https://www.visualstudio.com/pt-br/products/code-vs.aspx):

  • Edição focalizada em código: Um editor leve de primeira classe, com gestos centralizados no teclado, significa que você nunca precisa alcançar o mouse. Abra arquivos grandes ou pequenos instantaneamente no seu código sem distrações. Aproveite os recursos de edição avançados, tais como cursores múltiplos, salvamento automático e muito mais.
  • Navegação de código: Permaneça no contexto enquanto você se move através de grandes arquivos de código e através da sua base de código. A barra de rolagem aprimorada realça os problemas no arquivo atual, a localização integrada suporta expressões regulares. Estrutura de tópicos de código, navegação e definição de inspeção o ajudam a obter onde você precisa para ser rápido.
  • Compreensão de código: O IntelliSense descreve as APIs enquanto você digita, com preenchimento automático para aumentar a velocidade e a precisão. As ferramentas de informações rápidas permitem que você inspecione definições de API, e os “rabiscos” informam sobre problemas enquanto você digita.
  • Depuração: Diagnostique problemas em seu aplicativo com as ferramentas de depuração integradas para Node.js, TypeScript e JavaScript. Defina pontos de interrupção no seu código, interrompa exceções, inspecione variáveis, percorra o seu código, navegue pela pilha de chamadas – e conecte-se aos processos locais em execução.
  • Controle de versão do Git: Adote fluxos de trabalho modernos com o poder e a flexibilidade do Git. Veja arquivos alterados, compare e faça confirmações direto do editor. Conecte-se ao o universo Git inteiro extraindo e enviando código para qualquer editor remoto – GitHub, Azure Web Apps, Visual Studio Team Services e muito mais.
  • ASP.NET 5 e Node.js: O VSCode suporta o fluxo de trabalho de desenvolvimento de ponta a ponta para aplicativos em ASP.NET 5 e Node.js, IntelliSense completo, suporte para depuração e muito mais – em todos os sistemas operacionais compatíveis, incluindo muitos dos seus frameworks favoritos como D3, JQuery, Express, Angular, grunt, gulp e muito mais.

Dica: Um site muito legal contendo diversas extensões para o VSCode pode ser acessado aqui: https://marketplace.visualstudio.com/.

EBook Grátis: Visual Studio Code – Tips & Tricks Vol. 1

Usando o Visual Studio Code

O VSCode é um editor de código e adota uma interface de usuário comum com um leiaute de um explorador à esquerda, exibindo todos os arquivos e pastas a que você tem acesso, e um editor à direita, mostrando o conteúdo dos arquivos que você abriu.

Em seu leiaute, a interface do usuário está dividida em quatro áreas:

  1. Editor – a área principal para editar seus arquivos. Você pode abrir até três editores lado a lado;
  2. Barra lateral – contém diferentes visões, como o Explorer, para ajudá-lo enquanto você trabalha em seu projeto;
  3. Barra de status – Indica informações sobre o projeto aberto e os arquivos que você editar;
  4. Barra de visão – permite alternar entre visões e lhe dá indicadores de contexto específico adicionais, como o número de alterações de saída quando Git está habilitado;

Após baixar e instalar o VSCode, a sua primeira execução vai apresentar a seguinte visão:

vs_code1
– À esquerda, temos uma barra de ferramentas com as seguintes opções :

  • Explore – exibe e oculta os arquivos abertos;
  • Search – realiza buscas nos arquivos;
  • Git – permite realizar commits para o repositório do projeto;
  • Debug – permite a depuração;

Cada vez que iniciar o VSCode, ele vai abrir no estado em que estava quando da última vez que você o fechou. A pasta, o layout e os arquivos abertos são preservados.

vs_code2

Em vez de colocar os arquivos em guias separadas, o VSCode permite até três editores visíveis a qualquer momento, permitindo-lhe colocar até três arquivos juntos lado a lado.

Isso ajuda a reduzir a sobrecarga de guias, mas não restringe o número de arquivos com os quais você pode trabalhar. A exibição do Explorer mantém uma lista de arquivos de trabalho, permitindo-lhe acesso rápido aos arquivos que você precisa.

Para abrir mais de um editor você pode usar as seguintes opções:

  • Ctrl (Mac: ‘Cmd’) e clicar em um arquivo no Explorer
  • Ctrl+\  para dividir o editor ativo em dois
  • Opção Open to the Side: a partir do menu de contexto do Explorer

Explorer

O Explorer é usado para procurar, abrir e gerenciar todos os arquivos e pastas em seu projeto. Depois de abrir uma pasta no VSCode, o conteúdo da pasta é mostrado no Explorer. Você pode fazer muitas coisas, como:

  • criar, excluir e renomear arquivos e pastas
  • mover arquivos e pastas com arrastar e soltar
  • usar o menu de contexto para explorar todas as opções

Working Files (Arquivos de trabalho)

No topo do Explorer, existe uma seção chamada WORKING FILES que exibe uma lista de arquivos ativos que são arquivos anteriormente abertos no VSCode. Por exemplo, um arquivo será listado na seção de arquivos de trabalho, se você:

  • Fizer uma alteração em um arquivo
  • Clicar duas vezes em um arquivo no Explorador
  • Abrir um arquivo que não faz parte da pasta atual

vs_code3

Configurando o editor

O VSCode lhe dá muitas opções para configurar o editor. Você pode definir opções globalmente através de configurações de usuário ou por projeto/pasta através de configurações de espaço de trabalho. Os valores de configurações são mantidos em um arquivo de settings.json.

vs_code4

  • Selecione Files->Preferences->User Settings (ou pressione F1, digite user e trecla Enter) para editar o arquivo settings.json do usuário.
  • Selecione Files->Preferences->Workspace Settings (ou pressione F1, digite worksp e tecle Enter) para editar o arquivo settings.json do worksapce.

Você verá as configurações padrão de VSCode na janela à esquerda e seu arquivo settings.json editável à direita. Você pode facilmente analisar e copiar as configurações a partir da configurações padrão.

Depois de editar as configurações, digite Ctrl+S para salvar as alterações. As alterações entrarão em vigor imediatamente.

Save/Auto Save

Por padrão, o VSCode requer uma ação explícita para salvar suas alterações em disco, uma telas é teclar Ctrl+S.

No entanto, é fácil habilitar o Auto Save, que vai salvar as alterações após um atraso configurado ou quando o foco deixar o editor. Com essa opção ativada, não há nenhuma necessidade explicita de salvar o arquivo.

vs_code5

Para configurar o Auto Save, abra User Settings ou Workspace Settings e encontre as configurações associadas:

files.autoSave pode ter os valores:

  • off – para desativar o auto save
  • afterDelay – para salvar arquivos após um atraso
  • onFocusChange – configurado para salvar os arquivos quando o foco se move para fora do editor do arquivo

files.autoSaveDelay configura o atraso em milissegundos quando files.autoSave está configurado para afterDelay.

Pesquisar em todos os arquivos

O VSCode lhe permite procurar rapidamente sobre todos os arquivos na pasta atualmente aberta. Basta digitar Ctrl+Shift+F e a sua pesquisa.

Os resultados da pesquisa são agrupados em arquivos que contêm o termo de pesquisa, com a indicação dos acessos em cada arquivo e sua localização.

Expanda um arquivo para ver uma visualização de todos os hits dentro desse arquivo. Em seguida, dê um clique único em um dos acessos para visualizá-lo no editor.

vs_code6

Você pode configurar opções avançadas de Procura teclando Ctrl+Shift+J.

Navegação rápida de arquivos

O Explorer é ótimo para navegar entre os arquivos quando você está explorando um projeto. No entanto, quando você está trabalhando em um projeto, vai estar rapidamente saltando entre o mesmo conjunto de arquivos. O VSCode fornece dois comandos poderosos para navegar em e através de arquivos com teclas de fácil utilização.

Segure Ctrl e pressione Tab para ver uma lista de todos os arquivos que foram abertos desde que o VSCode foi iniciado.

Para abrir um desses arquivos, use Tab novamente para escolher o arquivo que você deseja navegar, em seguida, solte a tecla Ctrl para abri-lo.

Iniciando a partir da linha de comando

Você pode iniciar o VSCode a partir da linha de comando para abrir rapidamente um arquivo, pasta ou projeto.

Normalmente, você abre o VSCode dentro do contexto de uma pasta. A melhor forma de fazer isso é digitar:

code (abre o VSCode)

vs_code7

Às vezes, você vai querer abrir ou criar um arquivo. Se um arquivo não existir, ele será criado:

code macoratti_rt.rtf alunos.xml  (abre os arquivos relacionados)

vs_code8

Dica: Você pode ter tantos nomes de arquivos como você deseja separados por espaços.

Abrindo um projeto

O VSCode não distingue entre abrir uma pasta e abrir um projeto. Se ele detecta um projeto na pasta que você abriu (por exemplo, um projeto C#), o contexto do projeto será exibido na barra de status. Se mais de um projeto for encontrado, você pode alternar entre projetos de lá também.

Para abrir um projeto contido na pasta C:\src\WebApp, você iniciaria o VSCode assim:

code C:\src\webapp

Próximos passos

Creio que para começar com o VSCode já temos muita informação. Existem muito mais recursos do que os que foram aqui expostos, e trataremos desse assunto em artigos futuros.

Bons códigos como VSCode!

Até mais!

Mensagem do anunciante:

Conheça a Umbler, startup de Cloud Hosting por demanda feita para agências e desenvolvedores. Experimente grátis!

ASP .NET MVC – CRUD com Fluent NHibernate – Parte 02

$
0
0

Na primeira parte do artigo, criamos o projeto, definimos a fonte e o modelo de dados, realizamos o mapeamento usando o Fluent NHibernate e criamos a classe NHibernateHelper para realizar a conexão com o SQL Server.

Vamos agora definir o controlador e os métodos para realizar o CRUD no projeto ASP .NET MVC 5.

Recursos usados

Objetivos

  • Usar os recursos do NHibernate e Fluent NHibernate e realizar o CRUD em uma aplicação ASP .NET MVC.

Aprendizado

  • Realizar o CRUD em uma aplicação ASP .NET MVC  usando a linguagem C#.
  • Criar um banco de dados SQL Server 2012 Express.
  • Criar as entidades que fazem partem do modelo.
  • Realizar o mapeamento ORM usando o Fluent NHibernate.
  • Criar a classe NHibernateHelper e definir a SessionFactory.
  • Criar o controlador, definir os métodos e criar as views para realizar o CRUD.

Definindo o controlador e realizando o CRUD

Agora resta criar o controlador na pasta Controllers e definir os métodos para realizar o CRUD.

Clique com o botão direito sobre a pasta Controllers e a seguir em Add -> Controller.

Selecione a opção MVC5 Controllers with read/write actions e clique em Add.

mvc_crudnhb1

Informe o nome HomeController e clique no botão OK.

Teremos o controlador HomeController criado com o esqueleto dos métodos Index, Details, Create, Edit, Delete.

Nossa próxima tarefa será definir cada um desses métodos. Vamos lá…

Após a criação de cada view, eu vou fazer alguns ajustes traduzindo para o português alguns títulos e cabeçalhos.

Antes de iniciar, vamos declarar os seguintes namespaces no controlador HomeController:

using NHibernate;
using NHibernate.Linq;
using System.Linq;
using System.Web.Mvc;

1 – Método Index – Exibir uma lista de alunos

Inclua o código abaixo no método Index() :

        public ActionResult Index()
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {
                var alunos = session.Query<Aluno>().ToList();
                return View(alunos);
            }
        }

Este método retorna uma lista de alunos a partir da tabela Alunos.

Para criar a respectiva view, clique com o botão direito no interior do método e selecione Add View.

Defina o template List e informe o Model class conforme a figura abaixo:

mvc_crudnhb2

Será criado o arquivo Index.cshtml na pasta /Views/Home e o arquivo _Layout.cshtml  na pasta /Views/Shared.

Eu vou fazer alguns ajustes no arquivo de _Layout traduzindo alguns textos para o português.

Executando o projeto, iremos obter o resultado abaixo para a view Index:

mvc_crudnhb3

2 – Método Details – Exibir detalhes de um aluno

Agora inclua o código abaixo no método Details:

        public ActionResult Details(int id)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {
                var aluno = session.Get<Aluno>(id);
                return View(aluno);
            }
        }

Este método obtém as informações de um aluno.

Para criar a respectiva view, clique com o botão direito no interior do método e selecione Add View.

Defina o template Details e informe o Model class conforme a figura abaixo:

mvc_crudnhb4

Será criado o arquivo Details.cshtml na pasta /Views/Home.

Executando o projeto, iremos obter o resultado abaixo para a view Details:

mvc_crudnhb5

3 – Método Create – Incluir um novo aluno

O método Create possui o GET e o POST.

Vamos incluir o código a seguir no método Create(POST):

        [HttpPost]
        public ActionResult Create(Aluno aluno)
        {
            try
            {
                using (ISession session = NHibernateHelper.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        session.Save(aluno);
                        transaction.Commit();
                    }
                }
                return RedirectToAction("Index");
            }
            catch 
            {
                return View();
            }
        }

Este método inclui um novo aluno na tabela Alunos.

Para criar a respectiva view, clique com o botão direito no interior do método e selecione Add View.

Defina o template Create e informe o Model class conforme a figura abaixo:

mvc_crudnhb6

Será criado o arquivo Create.cshtml na pasta /Views/Home.

Executando o projeto, iremos obter o resultado abaixo para a view Create:

mvc_crudnhb7

Após informar os dados e clicar no botão Criar Aluno, teremos o aluno exibido na view Index():

mvc_crudnhb8

4 – Método Edit – Editar dados de um aluno

Para editar informações de um aluno, precisamos definir o método para o GET e para o POST.

1 – No método Edit(GET), inclua o código abaixo:

        // GET: Home/Edit/5
        public ActionResult Edit(int id)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {
                var aluno = session.Get<Aluno>(id);
                return View(aluno);
            }
        }

Este método apresenta os dados que desejamos editar.

2 – Após informar os dados a serem alterados, precisamos definir o código do método Edit(POST) abaixo que irá submeter e salvar as alterações:

       // POST: Home/Edit/5
        [HttpPost]
        public ActionResult Edit(int id, Aluno aluno)
        {
            try
            {
                using (ISession session = NHibernateHelper.OpenSession())
                {
                    var alunoAlterado = session.Get<Aluno>(id);

                    alunoAlterado .Sexo = aluno.Sexo;
                    alunoAlterado .Curso = aluno.Curso;
                    alunoAlterado .Email = aluno.Email;
                    alunoAlterado .Nome = aluno.Nome;

                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        session.Save(alunoAlterado);
                        transaction.Commit();
                    }
                }
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

Para criar a respectiva view, clique com o botão direito no interior do método Edit(GET) e selecione Add View.

Defina o template Edit e informe o Model class conforme a figura abaixo:

mvc_crudnhb9

Será criado o arquivo Edit.cshtml na pasta /Views/Home.

Executando o projeto, iremos obter o resultado abaixo para a view Edit:

mvc_crudnhb10

Após realizar as alterações, veremos os dados alterado na view Index().

5 – Método Delete – Deletar dados de um aluno

O método Delete também possui o GET que apresenta o aluno ao usuário.

Neste método, inclua o código a seguir:

        // GET: Home/Delete/5
        public ActionResult Delete(int id)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {
                var aluno = session.Get<Aluno>(id);
                return View(aluno);
            }
        }

Esse código localiza o aluno pelo seu ID e apresenta ao usuário para confirmar a exclusão.

Para excluir os dados, temos que incluir o código abaixo no método Delete(POST) :

        // POST: Home/Delete/5
        [HttpPost]
        public ActionResult Delete(int id, Aluno aluno)
        {
            try
            {
                using (ISession session = NHibernateHelper.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        session.Delete(aluno);
                        transaction.Commit();
                    }
                }
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

Para criar a respectiva view, clique com o botão direito no interior do método Delete(GET) e selecione Add View.

Defina o template Delete e informe o Model class conforme a figura abaixo:

mvc_crudnhb11

Será criado o arquivo Delete.cshtml na pasta /Views/Home.

Executando o projeto, iremos obter o resultado abaixo para a view Delete:

mvc_crudnhb12

Ao clicar no botão Deletar aluno, o aluno será excluído da tabela Alunos.

Dessa forma, acabamos de criar uma aplicação ASP .NET MVC realizando um CRUD básico com os recursos do NHibernate e Fluent NHibernate.

Pegue o projeto completo aqui: Crud_FluentNHibernate.zip (sem as referências).

Mensagem do anunciante:

Conheça a Umbler, startup de Cloud Hosting por demanda feita para agências e desenvolvedores. Experimente grátis!

C# 6.0 – Cinco novos recursos que é bom conhecer

$
0
0

Desde o seu lançamento, a linguagem C# tem evoluído a passos largos e, assim, seu uso por desenvolvedores de diversas áreas tem crescido.

A linguagem possui tantos recursos que muitas vezes usamos somente os mais comuns em nossa tarefa diária. Neste artigo, eu vou mostrar 5 recursos que a linguagem C# tem disponível que talvez você não conheça, mas que existem a partir da versão 6.0 da linguagem C#.

Todos os exemplos mostrados neste artigo foram testados no Visual Studio Community 2015 usando a versão 4.6 do .NET Framework.

Nota: para criar um projeto do tipo console no Visual Studio faça o seguinte:

  • Abra o VS Community 2015  e clique em New Project;
  • A seguir selecione Visual C# -> Console Application;
  • Informe o nome  do projeto e clique no botão OK.

Recursos usados:

1. Expression-bodied Function

Quantas vezes você teve que escrever um método de apenas uma linha de código?

Agora, com C# 6, você pode simplesmente criar um membro expression bodied contendo somente a expressão, sem usar as chaves {} ou ter um retorno explícito.

Antes, você só podia usar expressões lambdas em corpo de métodos que compunham uma classe. Agora, com as expressions bodied, é possível implementar métodos e propriedades somente de leitura a partir de expressões lambdas.

Para deixar claro o recurso, abaixo temos o código comparando a forma anterior e a forma usando expression-bodied:

C# 5.0

 public class Item
    {
        public int Quantidade { get; set; }
        public double Preco { get; set; }
        public double Total
        {
            get
            {
                return Quantidade * Preco;
            }
        }
    }

C# 6.0

public class Item
    {
        public int Quantidade { get; set; }
        public double Preco { get; set; }
        public double Total => Quantidade * Preco;
    }

Exemplo de utilização:

 class Program
 {
        static void Main(string[] args)
        {
            Item item = new Item();
            item.Preco = 5.00;
            item.Quantidade = 15;
            Console.WriteLine(String.Format(
                "*** Item de Venda ***\n" +
                "Quantidade: {0}\nPreco: {1}\nValor Total: {2}",
                item.Quantidade, item.Preco, item.Total));
            Console.ReadKey();
        }
 }

c_7recur11

Os membros de função das expression-bodied permitem que as propriedades, métodos, operadores e outros membros de função tenham corpos como expressões lambda (=>) ao invés de blocos de instrução, reduzindo assim a quantidade de código e dando uma visão mais claras sobre as expressões.

2. Operador Null Condicional

Nas versões anteriores da C#, você sempre tinha que escrever código para checar explicitamente a condição NULL antes de poder usar um objeto ou suas propriedades.

Da mesma forma que os tipos anuláveis (nullabe types), os operadores null-conditional podem ser usados para obter o mesmo resultado, bastando apenas usar o sinal ? depois da instância e antes de chamar a propriedade.

Dessa forma, a produtividade aumenta e a possibilidade de erros diminui.

Antes você fazia assim:

using System;
namespace OperadorNullCondicional
{
    class Program
    {
        static void Main(string[] args)
        {
            Funcionario funci = new Funcionario()
            {
                Nome = "Macoratti",
                Endereco = new Endereco()
                {
                    Residencial = "Rua Projetada, 100",
                    Trabalho = "Rua Peru, 300"
                }
            };
            if (funci != null && funci.Endereco != null)
            {
                Console.WriteLine((funci.Nome) + "  " + (funci.Endereco.Residencial ?? "Sem endereço"));
            }
            Console.ReadLine();
        }
    }
    public class Funcionario
    {
        public string Nome { get; set; }
        public Endereco Endereco { get; set; }
    }
    public class Endereco
    {
        public string Residencial { get; set; }
        public string Trabalho { get; set; }
    }
}

Agora, usando o recurso do operador Null Condicional(?) podemos fazer assim:

using static System.Console;
namespace OperadorNullCondicional
{
    class Program
    {
        static void Main(string[] args)
        {
            Funcionario funci = new Funcionario()
            {
                Nome = "Macoratti",
                Endereco = new Endereco()
                {
                    Residencial = "Rua Projetada, 100",
                    Trabalho = "Rua Peru, 300"
                }
            };
            WriteLine((funci?.Nome) + "  " + (funci?.Endereco?.Residencial ?? "Sem endereço"));
            ReadLine();
        }
    }
    public class Funcionario
    {
        public string Nome { get; set; }
        public Endereco Endereco { get; set; }
    }
    public class Endereco
    {
        public string Residencial { get; set; }
        public string Trabalho { get; set; }
    }
}

Assim, o operador verifica se a instância é null antes de chamar o método ou propriedade.

3. Inicializando auto propriedades e propriedades somente leitura a partir do construtor

Com C# 6.0, você pode inicializar as propriedades e propriedades somente de leitura a partir do construtor diretamente:

using static System.Console;
using System;
namespace InicialiarPropriedadesConstrutor
{
    class Program
    {
        static void Main(string[] args)
        {
            Aluno aluno = new Aluno();
            WriteLine("Nome " + aluno.Nome);
            WriteLine("Sobrenome " + aluno.SobreNome);
            WriteLine("Idade " + aluno.Idade);
            WriteLine("Registro " + aluno.DataRegistro);
            ReadLine();
        }
    }
    public class Aluno
    {
        public string Nome { get; set; } = "Jose Carlos";
        public string SobreNome { get; set; } = "Macoratti";
        public int Idade = 45;
        public DateTime DataRegistro { get; } = DateTime.Now;
    }
}

Resultado:

c_7recur12

Menos código a digitar, menos erros a cometer.

4. Usando expressões lambdas para definir propriedades Get

Da mesma forma que usamos as expressões lambdas nas expression-bodied, a C# 6.0 permite que você utilize expressões lambdas para implementar o valor get de propriedades somente-leitura.

Sempre que uma expressão lambda for encontrada, o compilador C# a identifica como uma propriedade contendo somente o método get e não como um campo.

using static System.Console;
using System.Linq;
namespace ExpressaoLambda_Get
{
    class Program
    {
        static void Main(string[] args)
        {
            Aluno aluno = new Aluno();
            WriteLine("Nome Completo " + aluno.NomeCompleto);
            WriteLine("Nome Reverso " + aluno.NomeReverso);
            ReadLine();
        }
    }
    public class Aluno
    { 
        public string Nome { get; set; } = "Jose Carlos";
        public string SobreNome { get; set; } = "Macoratti";
        public string NomeCompleto => new string((Nome + " " + SobreNome).ToArray());
        public string NomeReverso => new string(NomeReverso.Reverse().ToArray());
    }
}

Resultado:

c_7recur13

Simplificando a codificação.

5. Usando diretivas com classes estáticas

Você já deve saber que pode importar um namespace ou espaços de nomes usando a cláusula using. Isso nos dá a capacidade de usar um tipo citando apenas o seu nome no código e sem a necessidade de qualificá-lo totalmente usando o seu namespace completo.

Agora, na C# 6, podemos ir um passo além, e importar os membros estáticos de uma classe para o nosso namespace. Isto significa que podemos usar os membros estáticos de uma classe diretamente, sem necessidade de qualificá-los com o seu espaço para nome ou nome do tipo.

A sintaxe é ‘using static’ seguido do tipo cujos métodos estáticos desejamos importar.

Assim, esse recurso permite que todos os membros estáticos acessíveis de um tipo sejam importados, tornando-os disponíveis sem ter que utilizar o namespace completo no código.

Nota: eu já usei esse recurso nos exemplos anteriores.

Exemplo de uso:

using static System.Console;
using static System.Math;
using static System.DayOfWeek;
using static System.Linq.Enumerable;
namespace Using_Static
{
    class Program
    {
        static void Main(string[] args)
        {
            var numeros = Range(1, 10).ToArray();
            WriteLine("A raiz quadrada de 4 é : " + Sqrt(4));
            WriteLine(" 3 * 3 + 4 * 4  = " + Sqrt(3 * 3 + 4 * 4));
            WriteLine("Sexta-Feira " + Friday + "Segunda-feira : " + Monday);
            foreach (int num in numeros)
            {
                WriteLine(num);
            }
            ReadLine();
        }
    }
}

Resultado:

c_7recur14

Essas são apenas algumas das novidades da C# 6.0. Aguarde, em breve, outro artigo com mais novidades.

Pegue o projeto completo aqui: CSharp_6.zip

.NET – O que é TypeScript e quais os seus benefícios?

$
0
0
  • TypeScript permite escrever JavaScript do jeito que você realmente quer.
  • TypeScript é um super conjunto de JavaScript que compila para JavaScript simples.
  • Qualquer browser. Qualquer host. Qualquer sistema operacional. Código aberto.

As frases acima estão na página de entrada do TypeScript.

Por que aprender TypeScript?

  1. Porque você tem um JavaScript fortemente tipado;
  2. Você aproveita o seu conhecimento da POO para escrever melhores aplicativos JavaScript pequenos e grandes;
  3. O Angular2 recomenda o uso do TypeScript para o seu desenvolvimento;
  4. Equipes globais se beneficiarão do uso do TypeScript, visto que os erros podem ser detectados enquanto o código é digitado.

Assim, TypeScript é um super conjunto da linguagem JavaScript que fornece classes, interfaces e tipagem estática opcional.

Uma das grandes vantagens do TypeScript é permitir que os IDEs proporcionem um ambiente mais rico para detectar erros comuns enquanto você digita o código usando o recurso Intellisense (você tem o recurso do Intellisense se usar o Visual Studio da Microsoft).

Nota: Existem outros IDEs que também suportam TypeScript, como Atom, Sublime, VS Code e WebStorm.

Assim, em um projeto que você vai usar muito JavaScript, adotar o TypeScript pode trazer um ganho de produtividade e resultar em um produto mais robusto.

O TypeScript é open source e pode ser usado para desenvolver aplicações JavaScript do lado do cliente ou do lado do servidor (Node.js).

Ele foi introduzido como linguagem no Microsoft Visual Studio 2013 Update 2 e, por ser um super conjunto do JavaScript, qualquer programa JavaScript existente também é um programa TypeScript válido.

Resumindo

  • TypeScript faz a verificação de erros durante a compilação e permite gerar Javascript para diferentes versões do EcmaScript sem que você precise necessariamente se preocupar com isso.

Você pode acessar o link http://www.typescriptlang.org/Playground/ e estudar os principais recursos do TypeScript, acessar o tutorial rápido, ver exemplos, enfim, mergulhar nos recursos do TypeScript.

typscr1

  • O Playground é um editor TypeScript que verifica erros de sintaxe e compila o código para JavaScript.

Se você não quiser usar o Playground, pode usar o Visual Studio 2013 ou Visual Studio 2015.

Pode usar também o Visual Studio Code ou qualquer outro editor que suporte o recurso.

Assim, você tem disponível no ambiente do Visual Studio tudo o que é preciso para usar o TypeScript.

Bons códigos com TypeScript!

Mensagem do anunciante:

Conheça a Umbler, startup de Cloud Hosting por demanda feita para agências e desenvolvedores. Experimente grátis!


.Net – Apresentando e usando o FireBase

$
0
0

Neste artigo vou mostrar como criar uma aplicação web usando o Firebase em um artigo bem básico (este artigo é uma tradução livre).

O Firebase é uma poderosa API que pode ser usada para armazenar dados (como banco de dados backend) em tempo real, ideal para aplicações web. Ele permite criar aplicativos sem termos que ter o trabalho de gerenciar servidores ou escrever código do lado do servidor.

Combinando os recursos do Firebase com o AngularJS, e usando o recurso do two-way databinding,  podemos criar aplicações web bem interessantes. Dessa forma, usando o Firebase podemos construir aplicativos móveis multiplataforma nativos e aplicações web, usando um SDK Android, iOS ou JavaScript. Podemos, também, conectar o Firebase com nosso backend usando nossas bibliotecas do lado do servidor ou a nossa API REST.

Como esse artigo é nosso primeiro contato com o Firebase, vamos começar com uma artigo bem simples que mostrar como usar o Firebase.

Vamos, então, ao trabalho!

Os recursos usados:

Instalando o Firebase JS Library

Para poder  usar os recursos do Firebase, temos que incluir a sua biblioteca em nossas aplicações. Esta biblioteca lhe da acesso a recursos de autenticação e fornece estrutura de dados que são sincronizados automaticamente entre todos os seus clientes e com os servidores do Firebase. Se um usuário alterar alguma informação, todos os outros usuários verão a alteração imediatamente.

Vamos, então, iniciar um editor de textos e criar uma estrutura básica para um arquivo HTML, conforme mostrada abaixo:

<html>
  <head>
    
  </head>
  <body>
  </body>
</html>

Vamos incluir uma referência à biblioteca Firebase JavaScript adicionando a linha abaixo na seção <head>:

<html>
  <head>
    <script src='https://cdn.firebase.com/js/client/2.2.1/firebase.js'></script>
  </head>
  <body>
  </body>
</html>

Aqui estamos usando a distribuição CDN da Firebase JavaScript.

Agora, já podemos usar os recursos de autenticação e de banco de dados do Firebase.

Este artigo se concentra na base de dados em tempo real do Firebase, que também possui um poderoso recurso de autenticação e serviços de hospedagem.

Para acessar seu banco de dados Firebase, você precisa primeiro criar uma referência, que é criada usando uma URL que especifica os dados que você deseja acessar.

Vamos criar, então, um banco de dados Firebase nesta URL:  https://b35se3ldir1.firebaseio-demo.com/.

Para concluir esta etapa, crie uma referência para a raiz do seu banco de dados Firebase como mostrado abaixo:

<html>
  <head>
    <script src='https://cdn.firebase.com/js/client/2.2.1/firebase.js'></script>
  </head>
  <body>
    <script>
      var myDataRef = new Firebase('https://b35se3ldir1.firebaseio-demo.com/');
    </script>
  </body>
</html>

A referência myDataRef, agora referente ao seu banco de dados Firebase em: https://b35se3ldir1.firebaseio-demo.com/.

Um conceito central do banco de dados Firebase é que cada pedaço de dados tem sua própria URL. Você pode usar esta URL para acessar seus dados de várias maneiras:

  • A partir de qualquer biblioteca cliente Firebase
  • De nossa API REST
  • Introduzindo-o em qualquer navegador (experimente clicar no link acima)

Escrevendo dados

Vamos enviar uma mensagem de bate-papo.

Você pode usar a referência que acabou de criar para gravar dados em seu banco de dados Firebase utilizando a função set().

Para facilitar as coisas, nós já adicionamos caixas de texto de entrada para o nome e a mensagem do chat, bem como um manipulador de pressionamento de tecla que dispara sempre que alguém tenta enviar uma mensagem.

Para esta etapa, escreva uma mensagem para seu banco de dados Firebase usando a função set(), conforme mostrado abaixo:

<html>
  <head>
    <script src='https://cdn.firebase.com/js/client/2.2.1/firebase.js'></script>
    <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js'></script>
  </head>
  <body>
    <input type='text' id='nameInput' placeholder='Name'>
    <input type='text' id='messageInput' placeholder='Message'>
    <script>
      var myDataRef = new Firebase('https://b35se3ldir1.firebaseio-demo.com/');
      $('#messageInput').keypress(function (e) {
        if (e.keyCode == 13) {
          var name = $('#nameInput').val();
          var text = $('#messageInput').val();
          myDataRef.set('Usuário ' + name + ' diz ' + text);
          $('#messageInput').val('');
        }
      });
    </script>
  </body>
</html>

A gravação de dados em seu banco de dados Firebase é tão fácil como chamar set() em uma referência Firebase. Neste exemplo, usamos set() para escrever uma string: myDataRef.set(‘Usuário ‘ + name + ‘ diz ‘ + text).

O banco de dados Firebase pode suportar números, booleanos e dados da cadeia de tipos – o mesmo que um objeto normal de JavaScript.

Se você abrir este documento em um navegador, como FireFox, irá obter o seguinte resultado:

fb_tut11

Após digitar o nome e a mensagem abra o link: https://b35se3ldir1.firebaseio-demo.com/.

E você verá os dados persistidos conforme abaixo:

fb_tut12

Podemos usar a função set() para escrever objetos também. Abaixo temos um exemplo que podemos usar para substituir a linha de código onde escrevemos uma string:

myDataRef.set({name: name, text: text});

O banco de dados Firebase pode lidar com objetos de complexidade arbitrária. Se ele pode ser representado como JSON, pode caber no banco de dados.

Quando os objetos são gravados no banco de dados, a estrutura do objeto é mapeada para locais no banco de dados.

Neste exemplo, quando o objeto {name: name, text: text} for definido, locais para o nome e o texto são automaticamente criados como filhos do local referenciado pelo meu DataRef.

Firebase: o suporte a lista de dados (push)

Já vimos como escrever dados para locais nomeados específicos no banco de dados, mas a sua aplicação de chat irá requerer uma lista de mensagens. O banco de dados Firebase fornece uma função auxiliar chamada push() que faz com que a criação de listas seja muito fácil.

Altere o código abaixo para usar push() em vez de set() para que o seu chat possa suportar uma lista de mensagens (em vez de apenas uma):

<html>
  <head>
    <script src='https://cdn.firebase.com/js/client/2.2.1/firebase.js'></script>
    <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js'></script>
  </head>
  <body>
    <input type='text' id='nameInput' placeholder='Name'>
    <input type='text' id='messageInput' placeholder='Message'>
    <script>
      var myDataRef = new Firebase('https://b35se3ldir1.firebaseio-demo.com/');
      $('#messageInput').keypress(function (e) {
        if (e.keyCode == 13) {
          var name = $('#nameInput').val();
          var text = $('#messageInput').val();
          myDataRef.set({name: name, text: text});
          $('#messageInput').val('');
        }
      });
    </script>
  </body>
</html>

No banco de dados Firebase, as listas usam IDs globais únicos ordenados cronologicamente como chaves para itens. Isto significa que muitos clientes podem adicionar a mesma lista sem conflito.

Firebase: lendo dados

Vamos, agora, receber mensagens no chat.

Precisamos dizer ao banco de dados para nos informar quando as mensagens de chat chegarem. Fazemos isso adicionando um callback (chamada de retorno) para a lista de mensagens de bate-papo usando o método on(), como mostrado abaixo:

myDataRef.on('child_added', function(snapshot) {
  //a fazer
});

Este método usa dois argumentos:

  1. O tipo de evento
  2. A função de retorno

Nós vamos usar o  evento “child_added”, que é usado para retornar uma lista de itens de um banco de dados, de forma a sermos notificados da chegada de mensagens individuais.

Nota: Podemos também usar os seguintes eventos para ler dados a partir de um banco de dados Firebase:

  • Value – evento usado para ler um instantâneo estático dos conteúdos em um determinado caminho de banco de dados;

  • child_changed – evento é disparado sempre que um nó child é modificado;

  • child_removed – evento disparado quando um child imediato é removido;

  • child_moved – evento usado para trabalhar com dados solicitados.

Agora você está lidando com atualizações em tempo real!

Com o banco de dados Firebase, você sempre lê dados usando callbacks (ou chamada de retorno). Isso nos permite garantir que as aplicações Firebase sempre sejam atualizadas em tempo real.

CallBack (ou chamada de retorno, em português) é um mecanismo de controle de fluxo que visa beneficiar processos assíncronos.

A ideia principal é liberar a aplicação para que outras ações sejam tomadas sem que ela fique aguardando o retorno de processos síncronos, esperando uma resposta remota, ou (caso a plataforma/framework em uso suporte threading) com alto consumo de processamento se você abriu uma thread separada para esperar pela resposta.

Note que quando o aplicativo é iniciado, o banco de dados Firebase irá chamar o callback para todas as mensagens de chat existentes e, em seguida, continuar a chamá-lo para quaisquer novas mensagens que chegam.

Não existe nenhuma distinção entre os dados “iniciais” e dados “novos”. Isso permite que você escreva sua lógica de manipulação da mensagem uma vez, em vez de ter que lidar com esses dois casos separadamente.

Firebase: usando SnapShots

Agora precisamos exibir as mensagens de chat na página. Para isso, devemos fazer as seguintes tarefas:

  1. Para cada mensagem de bate-papo, o banco de dados irá chamar o seu callback com um instantâneo(snapshot) que contém os dados da mensagem;
  2. Extrair os dados da mensagem a partir do instantâneo chamando a função val() e atribuí-la a uma variável;
  3. Chamar a função displayChatMessage() para exibir a mensagem.

Abaixo temos o código para essa implementação:

<html>
  <head>
    <script src='https://cdn.firebase.com/js/client/2.2.1/firebase.js'></script>
    <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js'></script>
  </head>
  <body>
    <input type='text' id='nameInput' placeholder='Name'>
    <input type='text' id='messageInput' placeholder='Message'>
    <script>
      var myDataRef = new Firebase('https://b35se3ldir1.firebaseio-demo.com/');
      $('#messageInput').keypress(function (e) {
        if (e.keyCode == 13) {
          var name = $('#nameInput').val();
          var text = $('#messageInput').val();
          myDataRef.set({name: name, text: text});
          $('#messageInput').val('');
        }
      });
        myDataRef.on('child_added', function(snapshot) {
        var message = snapshot.val();
        displayChatMessage(message.name, message.text);
      });

      function displayChatMessage(name, text) {
        $('<div/>').text(text).prepend($('<em/>').text(name+': ')).appendTo($('#messagesDiv'));
        $('#messagesDiv')[0].scrollTop = $('#messagesDiv')[0].scrollHeight;
      };
    </script>
  </body>
</html>

Com isso, concluímos esse breve artigo mostrando como usar os recursos de banco de dados do FireBase.

Executando o código, iremos obter o seguinte resultado:

fb_tut13

Consultando os dados no FireBase neste link: https://a4yvf6lfow2.firebaseio-demo.com/ veremos: (no momento que fizemos o teste)

fb_tut14

Com isso, concluímos esse artigo introdutório sobre o Firebase.

Aguarde mais artigos relacionados a esse recurso em breve!

Mensagem do anunciante:

Conheça a Umbler, startup de Cloud Hosting por demanda feita para agências e desenvolvedores. Experimente grátis!

ASP .NET Core RC2 com Visual Studio Community 2015 – Usando o .NET CLI – Parte 01

$
0
0

Neste artigo, apresentei a chegada da versão RC2 da ASP .NET Core e os principais recursos. Dentre eles, o utilitário de linha de comando .NET CLI que veio substituir as ferramentas dnvm, dnx e dnu. E o .NET CLi terá o suporte ao VB .NET e F#.

Para pode usar o recurso .NET CLI você tem que instalar o Visual Studio Community com Update 2 e depois instalar o ASP .NET Core RC 2. Além disso, é recomendado instalar também o Visual Studio official MSI Installer e o NuGet Manager extension for Visual Studio.

Após instalar os pacotes relacionados, seu ambiente já está pronto para usar a ASP .NET Core e o .NET CLI.

Neste artigo, eu vou focar no utilitário de linha de comando .NET CLI, apresentando alguns dos seus recursos.

Iniciando com o .NET CLI

Abra um prompt de comando no seu ambiente digitando command ou cmd na guia de pesquisa do Windows para abrir a janela do prompt de comando.

Digite o comando cd \ para se posicionar na raiz:

aspn_corerc21

A seguir, crie uma pasta de trabalho digitando md testeNetCli e digite cd testeNetCli para se posicionar na pasta criada:

aspn_corerc22

Na versão anterior, o utilitário de linha de comando era o dnu (.NET Development Utilities) que fornecia uma variedade de funções utilitárias. Ele foi substituído pelo utilitário dotnet.

Nota: Para ver a documentação detalhada do dotnet, acesse este link.

Digite a seguir o comando : dotnet –help para visualizar a sintaxe de utilização:

aspn_corerc23

Criando um novo projeto .NET Core

Para criar um novo projeto .NET Core, digite : dotnet new

aspn_corerc24

Digitando type program.cs, veremos o código do arquivo Program.cs conforme a figura abaixo:

aspn_corerc25

Ou se preferir, use o Visual Studio Code  para abrir o arquivo:

aspn_corerc29

Digitando type project.json veremos o conteúdo do arquivo project.json exibindo as dependências do nosso projeto:

aspn_corerc26

Ou se preferir, use o Visual Studio Code  para abrir o arquivo:

aspn_corerc2b

Agora, precisamos restaurar todos os pacotes que estão especificados no arquivo project.json para o nosso exemplo. Para isso, digite : dotnet restore.

aspn_corerc27

Pronto! Agora podemos rodar o projeto digitando : dotnet run.

Este comando compila e roda a aplicação em uma etapa (substitui o antigo : dnx run)

aspn_corerc28

Nota: Podemos também compilar para IL digitando : dotnet build (irá gerar o executável copiando o arquivo para :bin/Debug/[framework]/[nome do binário])

Se você abrir a pasta testeNetCLi\bin\Debug\.netcoreapp1.0, vai ver os arquivos gerados conforme abaixo:

aspn_corerc2c

Nota: O que é legal é que ao gerar um EXE, ele se torna nativo em uma plataforma e não requer mais dependências externas. Para isso, use o comando : dotnet compile –native.

Assim, tivemos o primeiro contato como a ferramenta Net CLI.

Para mais exemplos, veja o link. E para saber mais, consulte a documentação.

Se você estiver um pouco decepcionado com o resultado, lembre-se que demos apenas o primeiro passo de uma longa jornada.

Na segunda parte do artigo, vou mostrar como criar um projeto ASP .NET Core no Visual Studio Community 2015.

Até mais!

.NET – Convertendo uma fonte de dados MS Access para PostgreSQL

$
0
0

No artigo de hoje vou mostrar como converter uma fonte de dados MS Access para PostgreSQL e acessar os dados usando a plataforma .NET.

Você já precisou converter uma fonte de dados do MS Access para PostgreSQL? Procurando no Google você vai encontrar muitas ferramentas que se propõe a realizar essa tarefa.

Nota: No site do PostgreSQL existe um link para uma ferramenta que faz isso: https://dbconvert.com/access/postgresql/ mas ela não é grátis.

No site da empresa Bullzip existe uma ferramenta gratuita chamada Access to PostgreSQL, que faz a conversão. É sobre essa ferramenta que o artigo vai tratar.

Para poder usar a ferramenta e enviar as tabelas do MS Access diretamente para o PostgreSQL, você vai precisar baixar um driver ODBC para o PostgreSQL neste link – não é preciso configurar uma conexão ODBC o programa faz isso para você.

Convertendo MS Access para PostgreSQL

Então, após baixar e instalar o driver ODBC e a ferramenta, a conversão é uma tarefa bem simples.

Vou mostrar o passo a passo da conversão do banco de dados Northwind.mdb para PostgreSQL:

1. A tela inicial do programa:

net_mspgsql11

2. O formulário para informar a fonte de dados MS Access a ser convertida:

net_mspgsql12

3. O formulário para definir o modo de acesso e informar os dados da conexão com o PostgreSQL e o nome de destino:

net_mspgsql13

4. O formulário onde podemos selecionar as tabelas que serão convertidas:

net_mspgsql14

5. O formulário com as opções de transferência:

net_mspgsql15

6. O formulário informando o progresso da conversão e ao final mostrando o resultado da conversão:

net_mspgsql16

Abrindo o pgAdmin III, podemos verificar a existência do schema Northwind_pgsql, que foi gerado pela ferramenta como conversão do banco de dadosNorthwind.mdb.

net_mspgsql17

Agora para mostrar que os dados existem e que podemos acessá-los usando o PostgreSQL, vou criar um exemplo usando a linguagem VB .NET e também C#.

Nota: Para saber mais sobre as strings de conexão usadas para o PostgreSQL veja esse link: https://www.connectionstrings.com/postgresql/

Recursos usados

Conectando com o banco de dados Northwind_pgsql

Acessar um banco de dados PostegreSQL na plataforma .NET é muito simples. Vou criar uma solução com dois projetos: um projeto VB .NET e outro C#, para acessar o banco de dados que convertemos.

Abra o VS Community 2015  e clique em New Project e, a seguir, selecione Other Project Types e clique em Visual Studio Solutions. Depois selecione Blank Solution e informe o nome Acessando_PostgreSQL e clique em OK.

net_mspgsql18

Agora vamos incluir dois projetos nesta solução.

No menu File, clique em New Project. Depois selecione a linguagem Visual C# e o template Windows Forms Application e informe o nome PostgreSQL_CSharp e clique em OK.

net_mspgsql19

Repetindo o procedimento acima, selecione a linguagem Visual Basic e o template Windows Forms Application e informe o nome PostgreSQL_VBNET e clique em OK.

net_mspgsql1a

Agora vamos incluir a referência ao conector PostgreSQL via Nuget em ambos os projetos da solução. Vou usar o Npgsql.

No menu Tools, clique em Nuget Package Manager e, a seguir, em Manage Nuget Packages for Solution;

Selecione o pacote Npgsql e clique em Install para os dois projetos da solução:

net_mspgsql1b

Agora temos tudo pronto para acessar o banco de dados Northwind_pgsql.

Vou abrir o projeto VB .NET e definir uma interface de usuário bem simples onde iremos ter os seguintes controles:

  • 1 DataGridView – dgvDados
  • 1 Combobox – cboTabelas
  • 1 Button – btnExecutar

O leiaute do formulário deverá ficar assim:

net_mspgsql1c

Neste momento, vamos definir o código do evento Click do botão de comando para acessar o banco de dados e a tabela informada exibindo os dados no controle DataGridView:

Imports System.Data
Imports Npgsql
Public Class form1
    Shared serverName As String = "127.0.0.1"
    Shared port As String = "5432"
    Shared userName As String = "postgres"
    Shared password As String = "sua_senha"
    Shared databaseName As String = "Northwind_pgsql"
    Private pgsqlConnection As NpgsqlConnection = Nothing
    Private connString As String = Nothing
    Private Sub btnExecutar_Click(sender As Object, e As EventArgs) Handles btnExecutar.Click
        Dim ConexaoPG As String = String.Format("Server={0};Port={1};User Id={2};Password={3};Database={4};", 
serverName, port, userName, password, databaseName)
        Dim conn As NpgsqlConnection = Nothing
        Try
            'Instancia NpgsqlConnection na variavel conn
            conn = New NpgsqlConnection(ConexaoPG)
            'Abre a conexão
            conn.Open()
            'Declara e atribui a instrucao SQL de consulta
            Dim SQL As String = "SELECT * FROM public." & cboTabelas.Text
            'Instancia o NpgsqlDataAdapter responsavel pela comunicação
            'é feita a leitura dos dados preenchendo o dataset
            Dim da As Npgsql.NpgsqlDataAdapter = New NpgsqlDataAdapter(SQL, conn)
            'Instancia um DataSet
            Dim ds As DataSet = New DataSet()
            'Preenche o DataAdapter
            da.Fill(ds, cboTabelas.Text)
            'Atribui um Datasource a Grid
            dgvDados.DataSource = ds.Tables(0).DefaultView
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            If Not conn Is Nothing Then
                If conn.State = ConnectionState.Open Then
                    conn.Close()
                End If
            End If
        End Try
    End Sub
    Private Sub form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        cboTabelas.SelectedIndex = 0
    End Sub
End Class

O código CSharp é visto a seguir:

using System;
using System.Data;
using System.Windows.Forms;
using Npgsql;
namespace PostgreSQL_CSharp
{
    public partial class Form1 : Form
    {
        static string serverName = "127.0.0.1";
        static string port = "5432";
        static string userName = "postgres";
        static string password = "sua_senha";
        static string databaseName = "Northwind_pgsql";
        public Form1()
        {
            InitializeComponent();
        }
        private void btnExecutar_Click(object sender, EventArgs e)
        {
            string ConexaoPG = string.Format("Server={0};Port={1};User Id={2};Password={3};Database={4};", 
serverName, port, userName, password, databaseName);
            NpgsqlConnection conn = null;
            try
            {
                //Instancia NpgsqlConnection na variavel conn
                conn = new NpgsqlConnection(ConexaoPG);
                //Abre a conexão
                conn.Open();
                //Declara e atribui a instrucao SQL de consulta
                string SQL = "SELECT * FROM public." + cboTabelas.Text;
                //Instancia o NpgsqlDataAdapter responsavel pela comunicação
                //é feita a leitura dos dados preenchendo o dataset
                Npgsql.NpgsqlDataAdapter da = new NpgsqlDataAdapter(SQL, conn);
                //Instancia um DataSet
                DataSet ds = new DataSet();
                //Preenche o DataAdapter
                da.Fill(ds, cboTabelas.Text);
                //Atribui um Datasource a Grid
                dgvDados.DataSource = ds.Tables[0].DefaultView;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                if ((conn != null))
                {
                    if (conn.State == ConnectionState.Open)
                    {
                        conn.Close();
                    }
                }
            }
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            cboTabelas.SelectedIndex = 0;
        }
    }
}

Executando o projeto e selecionando uma tabela, iremos obter os dados exibidos no controle datagridview.

Nota: Se você obter a mensagem de erro:  “relation <tablename> does not exist.”, verifique as permissões e privilégios do usuário que esta acessando a tabela.

Pegue o projeto completo aqui: Acessando_PostgreSQL.zip

Mensagem do anunciante:

Experimente a Umbler, startup de Cloud Hosting por demanda feita para agências e desenvolvedores e ganhe até R$ 100 em créditos!

ASP .NET Core RC2 c/ VS 2015 – Criando uma aplicação ASP .NET Core – Parte 02

$
0
0

Na primeira parte do artigo, tivemos o primeiro contato com o utilitário de linha de comando .NET CLI que veio substituir as ferramentas dnvm, dnx e dnu. Vamos, agora, criar uma aplicação ASP .NET Core usando os novos recursos da versão RC2 e mostrar algumas das alterações que houve na RC1.

Nota: Você tem que instalar os pacotes relacionados na primeira parte do artigo para usar a ASP .NET Core e o .NET CLI.

Criando sua primeira aplicação ASP .NET Core Web Application

Abra o Visual Studio Community 2015 com update 2 e clique em New Project. Selecione Visual C# e clique em Web e, então, você verá a janela abaixo exibindo dois novos tipos de projetos web:

aspn_corerc221

Os dois tipos de projetos são:

  • ASP.NET Core Web Application (.NET Core) – Projeto ASP.NET Core multiplataforma (Windows, Linux e OS X) , baseado no .NET Core;
  • ASP.NET Core Web Application (.NET Framework) – Projeto ASP.NET Core que emprega o .NET Framework, apenas para o ambiente Windows.

Vamos criar um projeto ASP .NET Core Multiplataforma com o nome AspNetCoreRC2_Multiplataforma:

aspn_corerc222

Ao clicar no botão OK, veremos na próxima janela 3 templates disponíveis:

  • Empty
  • Web API
  • Web Application

aspn_corerc223

Marque a opção Web Application sem autenticação e sem hospedagem na nuvem e clique no botão OK. Você verá na janela Solution Explorer a seguinte estrutura do projeto criado:

aspn_corerc224

Em destaque, temos a exibição do código da classe Program.cs.

Lembra que mencionei que ASP .NET Core é uma aplicação Console?

Observe que temos o método Main(), onde a aplicação será configurada e executada (este método antes estava no arquivo startup.cs).

Outra novidade é a volta do web.config:

aspn_corerc225

Outra alteração é que todos os namespaces Microsoft.AspNet. foram renomeados para Microsoft.AspNetCore:

aspn_corerc227

Nota: O pacote EntityFramework. foi alterado para Microsoft.EntityFrameworkCore.

Más notícias para que deseja migrar sua aplicação do RC1 para o RC2: vai ter que fazer essas alterações manualmente no arquivo project.json para atualizar a informação sobre os pacotes.

Outra alteração é que todas as variáveis de ambiente agora possuem o prefixo ASPNETCORE_. Assim, ASPNET_ENVIRONMENT agora é ASPNTECORE_ENVIRONMENT.

Mudanças no arquivo project.json:

  • Não existe mais a seção Commands;
  • compilationOptions agora é buildOptions, que contém a nova entrada: “debugType”: “portable”;
  • A seção frameworks agora possui entradas diferentes;
  • A seção runTimeOptions agora atem duas entradas.

Se você pressionar F5, irá rodar a aplicação obtendo o seguinte resultado:

aspn_corerc229

Vamos mexer um pouco no projeto… Abra o arquivo HomeController e altere o código da Action Index conforme abaixo:

aspn_corerc228

Agora abra a view Index.cshtml e inclua o código abaixo:

aspn_corerc22a

Rodando novamente a aplicação, agora teremos o seguinte resultado:

aspn_corerc22b

Assim criamos nossa primeira aplicação ASP .NET Core RC2.

Pelo que você notou, existe um longo caminho a percorrer até que possamos partir para a produção.

Até mais!

TypeScript – Configurando o VS Code para escrever, rodar e debugar

$
0
0
  • Typescript permite escrever JavaScript do jeito que você realmente quer.
  • Typescript é um super conjunto de JavaScript que compila para JavaScript simples.
  • Qualquer browser. Qualquer host. Qualquer sistema operacional. Código aberto.

As frases acima estão na página de entrada do TypeScript.

Neste artigo, vamos realizar as tarefas básicas para iniciar com o TypeScript no VS Code:

  1. Configurar o ambiente para o Typescript no Visual Studio Code.
  2. Escrever uma aplicação TypeScript bem simples.
  3. Rodar a aplicação na janela do console.
  4. Degubar o código TypeScript.

Instalando o TypeScript usando o NPM e o Visual Studio Code

O Typescript pode ser instalado de duas formas, ou seja, via NPM (Node Package Manager) ou através dos plugins do Visual Studio.

Nosso foco é usar o Visual Studio Code, então vamos instalar o TypeScript usando o NPM.

Abra uma janela do prompt de comando no seu ambiente Windows digitando Command ou Cmd na caixa de texto Pesquisar e digite o comando npm:

vs_ts-1

Você deverá ver a lista de comandos disponíveis para o NPM indicando que o npm está vivo no seu ambiente.

Agora vamos instalar o TypeScript digitando o seguinte comando: npm install -g typescript.

E, em seguida, digitando tsc -v para indicar a versão do TypeScript que foi instalada:

vs_ts-2

Depois, crie uma pasta na raiz do seu ambiente digitando md DemoTs.

vs_ts-3

Abra a pasta DemoTs no VS Code usando a opção File -> Open Folder:

vs_ts-4

Configurando o Task Runner para transpilar o JavaScript para o TypeScript

Você deve pressionar agora as teclas Ctrl+Shit+B no VS Code.

Fazendo isso, você vai obter o seguinte alerta:  “No task runner configured”.

Você deve então clicar em “Configure Task Runner” para criar o arquivo tasks.json, o que é uma coleção de tarefas para várias tarefas do TypeScript, Gulp, Grunt etc.

vs_ts-5

Após clicar em Configure Task Runner, selecione a opção TypeScript – watch mode.

Com isso, sempre que qualquer arquivo TypeScript for modificado ou salvo, ele será compilado imediatamente para um arquivo JavaScript:

vs_ts-6

Você verá o arquivo tasks.json ser criado e exibido conforme abaixo:

vs_ts-7

Usando a opção New File do VS Code, crie o arquivo tsconfig.json com o código abaixo:

vs_ts-8

Dessa forma, criamos um TypeScript Configuration File onde no código temos que:

  1. “–target”  – Informa ao TSC (TypeScript Compiler) para transpilar todo os arquivos TS para arquivos JS padrão;
  2. “–outDir” – É o diretório de saída dos arquivos JavaScripts transpilados,  ou seja, “jsScripts”
  3. “–sourceMap” – Ajuda a debugar o typescript.

Escrevendo o seu primeiro programa TypeScript – app.ts

Usando o VS Code (opção New File), crie um arquivo chamado app.ts com o código abaixo:

vs_ts-9

Após salvar o arquivo, vamos dar um build no projeto teclando Ctrl+Shit+B:

vs_ts-10

Após alguns segundos, você verá a mensagem de compilação e notará a criação da pasta jsScripts com os arquivos app.js e app.js.map.

Isso indica que o TypeScript foi transpilado para JavaScript e estamos prontos para rodar a aplicação.

Rodando o projeto e vendo a saída no console

Pressione as teclas Ctrl+Shift+D par abrir o painel Debug.

A seguir, clique no ícone: Open launch.json.

vs_ts-11

Copie e cole o código conforme mostra a figura abaixo no arquivo launch.json e salve-o:

vs_ts-12

Agora é só alegria…

Pressione F5 para rodar a aplicação e ver o resultado no console conforme a figura abaixo:

vs_ts-13

Debugando sua aplicação TypeScript no VS Code

Vamos colocar um breakpoint no arquivo app.ts na linha da definição da variável ola e rodar a aplicação e ver o debug em ação.

Veja o que acontece:

  1. Definimos um breakpoint e rodamos a aplicação;
  2. Quando o breakpoint é atingido vemos a call stack;
  3. Podemos avançar linha a linha no debug e vemos na janela de saída a movimentação do arquivo app.ts para o arquivo app.js:

vs_ts-14

Chegamos assim ao final, e já configuramos e criamos a nossa aplicação TypeScript para rodar no VS Code.

Pegue o código da aplicação aqui: DemoTs.zip.

Até mais!

Mensagem do anunciante:

Experimente a Umbler, startup de Cloud Hosting por demanda feita para agências e desenvolvedores e ganhe até R$ 100 em créditos!

C# – Usando expressões regulares compiladas

$
0
0

Neste artigo, vou mostrar como podemos minimizar o impacto no desempenho de uma aplicação que surge quando precisamos usar expressões regulares com frequência.

Por padrão, quando você cria um objeto Regex, o padrão da expressão regular especificado no construtor é compilado para uma forma intermediária (não MSIL). Então, cada vez que você usar o objeto Regex, o runtime interpreta a forma intermediária do padrão e o aplica para a sequência alvo.

Com expressões regulares complexas que são usadas com frequência, esse processo de interpretação repetido pode ter um efeito negativo sobre o desempenho do seu aplicativo.

Ao especificar a opção RegexOptions.Compiled, quando você cria um objeto Regex, você força o runtime .NET a compilar a expressão regular para a MSIL em vez de usar uma forma intermediária interpretada.

Esse MSIL é compilado just-in-time (JIT) pelo runtime para um assembly nativo na primeira execução, assim como um assembly regular. Você então usa uma expressão regular compilada da mesma maneira como você usa qualquer objeto Regex; a compilação simplesmente resulta em uma execução mais rápida.

No entanto, existem alguns efeitos colaterais nesse procedimento:

  • Em primeiro lugar, o compilador JIT tem que fazer mais trabalho, que irá introduzir atrasos durante a compilação JIT. Isso é mais perceptível se você criar as suas expressões regulares compiladas quando o seu aplicativo for iniciado;
  • Em segundo lugar, o runtime não consegue descarregar uma expressão regular compilada depois de ter terminado o processamento;
  • Ao contrário de uma expressão regular normal, o coletor de lixo não irá recuperar a memória usada pela expressão regular compilada. A expressão regular compilada permanecerá na memória até que o seu programa termine ou você descarregue o domínio do aplicativo em que a expressão regular compilada é carregada.

O método estático Regex.CompileToAssembly permite que você crie uma expressão regular compilada e a grave em um assembly externo.  Isso significa que você pode criar assemblies contendo conjuntos de expressões regulares, que você pode usar a partir de múltiplas aplicações. Para compilar uma expressão regular persistindo-a para um assembly, basta seguir os procedimentos que iremos descrever a seguir.

Compilando um Regex para um Assembly

A seguir, temos as etapas para compilar um Regex para um assembly:

  • Crie uma matriz do tipo System.Text.RegularExpressions.RegexCompilationInfo grande o suficiente para conter um objeto RegexCompilationInfo para cada uma das expressões regulares compiladas que você deseja criar.
  • Crie um objeto RegexCompilationInfo para cada uma das expressões regulares compiladas. Especifique valores para as suas propriedades como argumentos para o objeto construtor. A seguir estão as propriedades mais utilizadas:
  1. IsPublic, um valor booleano que especifica se a expressão regular gerada tem visibilidade pública;
  2. Name, um valor String que especifica o nome da classe;
  3. Namespace, um valor String que especifica o namespace da classe;
  4. Pattern, um valor String que especifica o padrão que a expressão regular irá corresponder;
  5. Options, um valor do tipo System.Text.RegularExpressions.RegexOptions que especifica opções para a expressão regular.
  • Crie um objeto do tipo System.Reflection.AssemblyName e configure-o para representar o nome do assembly que o método Regex.CompileToAssembly irá criar;
  • Execute o Regex.CompileToAssembly passando o array RegexCompilationInfo e o objeto AssemblyName.

Esse processo cria uma assembly que contém uma declaração de classe para cada expressão regular compilada em que cada classe deriva de Regex. Para usar a expressão regular compilada contida no assembly, basta instanciar a expressão regular que você deseja usar e chamar o método como se você tivesse simplesmente criado com o construtor Regex normal.

Neste artigo eu vou mostrar um exemplo de como criar um objeto Regex que é compilado para o MSIL em vez da forma intermediária usual.

Recursos usados:

Criando o projeto no VS Community

Abra o VS Community 2015  e clique em New Project.

A seguir, selecione Visual C# -> Console Application.

Informe o nome Regex_MSIL e clique no botão OK.

c_cregex-1

Em seguida, defina o seguinte código no método Main() da classe Program.cs:

using System;
using System.Reflection;
using System.Text.RegularExpressions;

namespace Regex_MSIL
{
    class Program
    {
        static void Main(string[] args)
        {
            string mensagem = null;

            Console.WriteLine("Criando dois objetos Regex Compilados: PinRegex e CartaoCreditoRegex.");
            Console.WriteLine("Processando...");
            Console.WriteLine("");
            try
            {
                // Cria um array para tratar as informações do objeto Regex (definimos um array com tamanho 2)
                RegexCompilationInfo[] regexInfo = new RegexCompilationInfo[2];

                // Cria o RegexCompilationInfo para a expressão PinRegex
                regexInfo[0] = new RegexCompilationInfo(@"^\d{4}$", RegexOptions.Compiled, "PinRegex", "", true);

                // Cria o RegexCompilationInfo para o objeto CartaoCreditoRegex.
                regexInfo[1] = new RegexCompilationInfo(@"^\d{4}-?\d{4}-?\d{4}-?\d{4}$", RegexOptions.Compiled, "CartaoCreditoRegex", "", true);

                // Cria um AssemblyName  para definir um assembly de destino.
                AssemblyName assembly = new AssemblyName();
                assembly.Name = "MacorattiRegEx";

                // Cria a expressão regular compilada
                Regex.CompileToAssembly(regexInfo, assembly);
                mensagem = "Os objetos Regex - PinRegex e CartaoCreditoRegex - foram criados e compilados com sucesso ";
            }
            catch (Exception ex)
            {
                mensagem = ex.Message;
            }

            Console.WriteLine(mensagem);
            Console.ReadKey();
        }
    }
}

Esse código irá criar o arquivo MacorattiRegEx.dll contendo as nossas expressões regulares – CartaoCreditoRegex e PinRegex – compiladas.

Executando o projeto, iremos obter o resultado exibido a seguir:

c_cregex-2

Pegue o projeto completo aqui: Regex_MSIL.zip.

Mensagem do anunciante:

Experimente a Umbler, startup de Cloud Hosting por demanda feita para agências e desenvolvedores e ganhe até R$ 100 em créditos!

VB .NET – Criando um DataGridView no modo não vinculado

$
0
0

Neste artigo, vou mostrar como implementar o controle DataGridView usando o modo não vinculado ou unbound mode.

O DataGridView é muito usado para exibir dados de diversas fontes de dados, e isso é feito quase sempre no modo vinculado no qual você define uma fonte de dados, que geralmente é um banco de dados relacional, e utiliza a propriedade DataSource do controle para vincular os dados ao controle.

Ocorre que você pode precisar exibir dados tabulares cuja origem não seja um banco de dados. Por exemplo, você pode querer exibir o conteúdo de uma matriz bidimensional ou o conteúdo de um array ou de uma lista de strings, e por aí vai.

Para esses casos, o controle DataGridView fornece uma forma fácil e personalizável para exibir dados sem fazer a vinculação com a fonte de dados diretamente, mas usando o modo não vinculado.

Neste artigo, veremos como preencher um controle DataGridView, gerenciar a inclusão, exclusão de informações e adicionar novas linhas usando o modo não vinculado.

Recursos usados:

Criando o projeto no VS Community

Abra o VS Community 2015  e clique em New Project.

A seguir, selecione Visual Basic -> Windows -> Windows Forms Application.

Informe o nome DataGridView_UnBound e clique no botão OK.

vbn_1

Agora vamos implementar o Datagridview usando o modo não vinculado e preenchendo o controle com informações de músicas populares exibindo os dados.

1 – Definindo o código inicial no formulário form1.vb

No formulário form1.vb, vamos definir o código que contém uma inicialização básica, declarando algumas variáveis, que serão:

  • 1 Panel – pnlButton
  • 1 DataGridView – dgvMusicas
  • 2 Buttons – btnIncluirNovaLinha e btnDeletarLinha

Vamos definir também um método Main e um leiaute básico para o formulário no seu construtor.

Abaixo, temos o código e resultado da execução do projeto neste estágio:

Public Class Form1

    Private pnlButton As New Panel
    Private WithEvents dgvMusicas As New DataGridView
    Private WithEvents btnIncluirNovaLinha As New Button
    Private WithEvents btnDeletarLinha As New Button

    <STAThreadAttribute()>
    Public Shared Sub Main()
        Application.EnableVisualStyles()
        Application.Run(New Form1())
    End Sub

End Class

2 – Definindo o método para configurar o leiaute do formulário

No código abaixo, definimos no método DefinirLeiaute() o tamanho do formulário e as propriedades dos controles que vamos incluir no formulário.

Note que incluímos os botões no controle Panel (pnlButton) e depois incluímos o controle Panel no formulário:  Me.Controls.Add(Me.pnlButton).

Private Sub DefinirLeiaute()

        Me.Size = New Size(600, 500)
        With btnIncluirNovaLinha
            .Text = "Adicionar Nova Linha"
            .BackColor = Color.WhiteSmoke
            .Location = New Point(10, 10)
        End With
        With btnDeletarLinha
            .Text = "Deletar Linha"
            .BackColor = Color.WhiteSmoke
            .Location = New Point(100, 10)
        End With
        With pnlButton
            .Controls.Add(btnIncluirNovaLinha)
            .Controls.Add(btnDeletarLinha)
            .Height = 50
            .Dock = DockStyle.Bottom
        End With
        Me.Controls.Add(Me.pnlButton)
End Sub

3 – Definindo o método para configurar o controle DataGridView

O método ConfiguraDataGridView() inclui o controle na coleção de controles do formulário e configura linhas, colunas e algumas propriedades do DataGridView.

 Private Sub ConfiguraDataGridView()

        Me.Controls.Add(dgvMusicas)

        dgvMusicas.ColumnCount = 5
        With dgvMusicas.ColumnHeadersDefaultCellStyle
            .BackColor = Color.Navy
            .ForeColor = Color.White
            .Font = New Font(dgvMusicas.Font, FontStyle.Bold)
        End With

        With dgvMusicas
            .Name = "dgvMusicas"
            .Location = New Point(8, 8)
            .Size = New Size(500, 250)
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
            .ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
            .CellBorderStyle = DataGridViewCellBorderStyle.Single
            .GridColor = Color.Black
            .RowHeadersVisible = False

            .Columns(0).Name = "Lançamento"
            .Columns(1).Name = "Faixa"
            .Columns(2).Name = "Título"
            .Columns(3).Name = "Artista"
            .Columns(4).Name = "Album"
            .Columns(4).DefaultCellStyle.Font = New Font(Me.dgvMusicas.DefaultCellStyle.Font, FontStyle.Italic)
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            .MultiSelect = False
            .Dock = DockStyle.Fill
        End With
    End Sub

4 – Preenchendo o DataGridView com dados

O método PopularDataGridView() define alguns arrays de strings como dados do controle e atribui cada array à propriedade rows do controle, além de configurar a propriedade Columns para exibir os dados.

Private Sub PopularDataGridView()

        Dim linha0 As String() = {"22/11/1968", "29", "Revolution 9", "Beatles", "The Beatles [White Album]"}
        Dim linha1 As String() = {"08/03/1960", "6", "Fools Rush In", "Frank Sinatra", "Nice 'N' Easy"}
        Dim linha2 As String() = {"11/11/1971", "1", "One of These Days", "Pink Floyd", "Meddle"}
        Dim linha3 As String() = {"1988", "7", "Where Is My Mind?", "Pixies", "Surfer Rosa"}
        Dim linha4 As String() = {"10/5/1981", "9", "Can't Find My Mind", "Cramps", "Psychedelic Jungle"}
        Dim linha5 As String() = {"10/06/2003", "13", "Scatterbrain. (As Dead As Leaves.)", "Radiohead", "Hail to the Thief"}
        Dim linha6 As String() = {"1960", "3", "O amor , o sorriso e a flor", "João Gilberto", ""}
        Dim linha7 As String() = {"1966", "1", "A ", "Chico Buarque", "Chico Buarque"}
        Dim linha8 As String() = {"1968", "2", "Balada do Louco", "Os Mutantes", "Os Mutantes"}

        With Me.dgvMusicas.Rows
            .Add(linha0)
            .Add(linha1)
            .Add(linha2)
            .Add(linha3)
            .Add(linha4)
            .Add(linha5)
            .Add(linha6)
            .Add(linha7)
            .Add(linha8)
        End With

      'note que estamos alterando a orde de exibição das colunas o datagridview
        With Me.dgvMusicas
            .Columns(0).DisplayIndex = 3
            .Columns(1).DisplayIndex = 4
            .Columns(2).DisplayIndex = 0
            .Columns(3).DisplayIndex = 1
            .Columns(4).DisplayIndex = 2
        End With

    End Sub

5 – Incluindo novas linhas no controle DataGridView

Para incluir novas linhas no controle usando o evento Click do botão de comando btnIncluirNovaLinha, usamos o método Rows.Add() para incluir uma nova linha:

Private Sub btnIncluirNovaLinha_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnIncluirNovaLinha.Click
        Me.dgvMusicas.Rows.Add()
    End Sub

6 – Deletando linhas do controle DataGridView

Para deletar uma linha, usamos o evento Click do botão de comando btnDeletarLinha onde verificamos e existem informações no controle, e se o índice da linha selecionando não é igual a quantidade de linhas existentes, para a seguir usar o método RemoveAt e excluir a linha com o índice selecionado:

Private Sub btnDeletarLinha_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnDeletarLinha.Click

        If Me.dgvMusicas.SelectedRows.Count > 0 AndAlso
        Not Me.dgvMusicas.SelectedRows(0).Index = Me.dgvMusicas.Rows.Count - 1 Then
            Me.dgvMusicas.Rows.RemoveAt(Me.dgvMusicas.SelectedRows(0).Index)
        End If

End Sub

7 – Chamando os métodos no evento Load do formulário

Agora, basta chamar os métodos definidos no evento Load do formulário conforme o código a seguir:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Me.Text = "Usando o DataGridView no modo Não Vinculado"
        Me.BackColor = Color.SandyBrown
        DefinirLeiaute()
        ConfiguraDataGridView()
        PopularDataGrid()

End Sub

Executando o projeto neste momento, iremos o obter o seguinte resultado:

vbn_2

Você pode incrementar o exemplo definindo outros recursos, como validações, formatações etc.

Como exemplo, abaixo estamos usando o evento CellFormating para validar a coluna Lançamento, de forma que, se o usuário editar essa coluna, deverá entrar a data no formato ToShortDateString() ( dd/MM/yyyy) ou obterá uma mensagem de erro:

Private Sub dgvMusicas_CellFormatting(ByVal sender As Object,
    ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dgvMusicas.CellFormatting

        If e IsNot Nothing Then

            If Me.dgvMusicas.Columns(e.ColumnIndex).Name = "Lançamento" Then
                If e.Value IsNot Nothing Then
                    Try
                        e.Value = DateTime.Parse(e.Value.ToString()).ToShortDateString()
                        e.FormattingApplied = True
                    Catch ex As FormatException
                        MessageBox.Show("{0} não é uma data válida.", e.Value.ToString())
                    End Try
                End If
            End If
        End If
End Sub

Abaixo, vemos uma simulação para uma entrada de data no formato incorreto que será validado pelo código acima:

vbn_3

Assim, você pode usar o DataGridView no modo não vinculado e personalizando o seu comportamento e suas propriedades.

Pegue o projeto completo aqui: DataGridView_UnBound.zip.

Mensagem do anunciante:

Experimente a Umbler, startup de Cloud Hosting por demanda feita para agências e desenvolvedores e ganhe até R$ 100 em créditos!


C# – Apresentando a classe Mutex

$
0
0

Neste artigo, vou apresentar a classe Mutex, seu conceito, suas propriedades, como podemos usá-la e um exemplo prático na linguagem C#.

O que é Mutex? Mutex é uma forma abreviada de mutually exclusive.

A definição da MSDN (numa tradução livre by Macoratti) diz o seguinte  sobre Mutex: “É um primitivo de sincronização que também pode ser usado para sincronização entre processos” (arre égua…).

fonte: https://msdn.microsoft.com/pt-br/library/system.threading.mutex%28v=vs.110%29.aspx

Na linguagem C#, Mutex é uma classe definida na livraria de classes da plataforma .NET (namespace System.Threading) que pode ser usada para prevenir a execução simultânea de um bloco de código por múltiplas threads que estão rodando em um processo único ou múltiplo.

Assim, Mutex é usado como um primitivo de sincronização em situações em que o recurso tem que ser compartilhado com múltiplas threads simultaneamente. Os objetos Mutex nomeados são usados para fazer a sincronização interprocessos, porque vários aplicativos podem acessar o mesmo objeto Mutex.

A classe Mutex foi projetada para proteger um recurso compartilhado, como memória, um identificador de arquivo ou uma conexão de rede de acesso simultâneo por vários segmentos ou processos.

Quando uma ou mais threads necessitam de acesso a um recurso partilhado ao mesmo tempo, o sistema necessita de um mecanismo de sincronização para garantir que apenas um segmento de cada vez utiliza o recurso.

Mutex é um primitivo de sincronização que concede acesso exclusivo para o recurso compartilhado para apenas uma thread. Se uma thread adquire um Mutex, o segundo segmento que quer adquirir esse Mutex é suspenso até que a primeira thread libere o Mutex. Isso ajuda a evitar a corrupção dos dados que pode ocorrer se não houver uma sincronização.

Um dos seus usos mais frequentes é verificar se há uma única instância de um aplicativo rodando ao mesmo tempo. Você pode criar objetos Mutex com um identificador único que podem ser abertos por outros processos e, assim, garantir que apenas uma instância está sendo executada no computador.

A seguir, vou mostrar dois exemplos básicos de usos da classe Mutex usando o VS 2013 Community e o VS 2015 Community.

Recursos usados:

1 – Usando Mutex e verificando se mais de uma instância está em execução

Neste exemplo, vamos criar uma aplicação Console e verificar se existe um objeto Mutex criado para definir se já existe uma instância em execução.

Abra o VS Community 2013  e clique em New Project.

A seguir, selecione Visual C# -> Windows -> Windows Forms Application.

Informe o nome Usando_Mutex e clique no botão OK.

mutex-1

Abra o arquivo Program.cs gerado no projeto e inclua o código abaixo:

using System;
using System.Threading;

namespace Usando_Mutex
{
    class Program
    {
        static Mutex _mutex;

        static bool IsSingleInstance()
        {
            try
            {
                // Tenta abrir um mutex existente
                Mutex.OpenExisting("MACORATTI");
            }
            catch
            {
                // se não existir um mutex ocorre uma exceção
                Program._mutex = new Mutex(true, "MACORATTI");

                // Existe somente uma instância
                return true;
            }
            // Sem exceção então existe mais de uma instância
            return false;
        }

        static void Main(string[] args)
        {
            if (!Program.IsSingleInstance())
            {
                Console.WriteLine("Existe Mais de uma instância em execução"); //sair
            }
            else
            {
                Console.WriteLine("Existe somente Uma instância em Execução"); //Continuar
            }
            Console.ReadLine();
        }
    }
}

O método OpenExisting() da classe Mutex abre um Mutex nomeado se ele já existir.

Se não existir uma instância do objeto Mutex, o método gera uma exceção em vez de criar o objeto do sistema. Para criar um objeto Mutex, podemos usar um dos construtores Mutex.

Para testar, eu vou abrir duas instâncias do Visual Studio abrindo o mesmo projeto e executar cada instância.

Na execução da primeira instância do VS, temos o seguinte resultado:

mutex-2

Executando a segunda instância do VS obtemos o resultado abaixo:

mutex-3

2 – Permitindo somente uma instância em execução

Neste exemplo, vamos criar uma aplicação Windows Forms e permitir somente uma instância da aplicação.

Abra o VS Community 2015  e clique em New Project.

A seguir, selecione Visual C# -> Windows -> Windows Forms Application.

Informe o nome Mutex_UmaInstancia e clique no botão OK.

A partir da ToolBox, inclua os seguintes controles no formulário form1.vb:

  • 1 Label – Executar Somente Uma Instância com Mutex

Abaixo leiaute do formulário:

mutex-4

O projeto em si não tem importância, o que vale é mostrar a utilização da classe Mutex.

Vamos fazer isso.

Abra o arquivo Program.cs e inclua o código abaixo:

using System;
using System.Threading;
using System.Windows.Forms;

namespace Mutex_UmaInstancia
{
    static class Program
    {
        // Define um nome Unico para sua aplicação
        static Mutex mutex = new Mutex(false, "Macoratti_App_ID");

        [STAThread]
        static void Main()
        {
            // espera por 3 seconds ate ter certeza de que não há outra instância sendo executada
            if (!mutex.WaitOne(TimeSpan.FromSeconds(3), false))
            {
                MessageBox.Show("Outra instância dessa aplicação já esta sendo executada");
                return;
            }

            try
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            finally
            {
                mutex.ReleaseMutex();
            }
        }
    }
}

Usamos o método WaitOne(int32, boolean) que bloqueia a thread atual até que a instância atual recebe um sinal, usando um TimeSpan para especificar o intervalo de tempo e especificar se deseja sair do domínio de sincronização antes do tempo de espera.

O método ReleaseMutex – Libera o Mutex. Ele será liberado quando a aplicação termina, mas mesmo se a aplicação terminar sem liberar o Mutex, ele será  automaticamente liberado pelo .NET Framework.

Para testar, vamos abrir duas instâncias do VS abrindo o mesmo projeto.

Ao executar o projeto pela primeira vez, teremos o seguinte resultado:

mutex-5

Na primeira vez, temos somente uma instância em execução e a aplicação é executada normalmente.

Executando a segunda instância, teremos o resultado a seguir:

mutex-6

Na segunda execução, o Mutex detecta que outra instância já está em execução e lança a exceção que capturamos e exibimos a mensagem acima.

Como a classe Mutex é um invólucro para uma construct Win32, ela requer transições de interoperabilidade que resultam em uma queda no desempenho.

Por esse motivo, ela não é uma boa opção, a menos que seu uso seja realmente necessário.

Pegue os projetos completos aqui: Usando_Mutex.zip (VS 2013)  e Mutex_UmaInstancia.zip (VS 2015).

Mensagem do anunciante:

Experimente a Umbler, startup de Cloud Hosting por demanda feita para agências e desenvolvedores e ganhe até R$ 100 em créditos!

Xamarin – Espelhando o seu smartphone no Windows 10 como Vysor

$
0
0

Neste artigo, vou mostrar como espelhar o seu smartphone no Windows 10 usando o Vysor do Google para fazer o deploy das aplicações Xamarin.

Para testar as suas aplicações desenvolvidas no Xamarin, você tem à sua disposição diversos emuladores que permitem que você teste e debug suas aplicações Xamarin.

Uma opção mais interessante é poder testar e debugar sua aplicação no dispositivo físico e, para isso, basta você espelhar o seu smartphone no seu ambiente de trabalho.

Veremos que fazer isso é muito simples e você vai precisar dos seguintes recursos:

  • Um smartphone Android
  • Vysor

Então, vamos ao trabalho…

Primeiro, ative o modo de desenvolvedor do Android no seu Smartphone.

Abra as configurações do sistema -> Sobre telefone. Localize – Número da versão e toque várias vezes até que apareça a mensagem : “Você agora é um desenvolvedor”.

Depois, ative a “Depuração USB”: Abra as configurações do sistema -> Sistema -> Desenvolvedor -> Depuração.

Toque em OK para marcar a opção: Depuração USB.

Agora abra o Google Chrome e instale a extensão Vysor:

xamand_dev1

Conecte o seu smartphone na porta USB do computador/notebook e clique em Find Devices:

xamand_dev6

Selecione o smartphone da lista e pronto!

xamand_dev2

Clique no botão View e você deverá visualizar a seguinte tela:

xamand_dev7

Clique em OK e voilá…

xamand_dev3

xamand_dev9

Esta versão do Vysor é gratuita, mas oferece uma resolução baixa. Se desejar uma qualidade de imagem melhor, existem as versões pagas:

xamand_dev5

xamand_dev8

Mesmo com essa limitação, creio que a ferramenta oferece bons recursos, e se você precisar pode optar pela versão Pro.

É recomendável também você instalar os drivers ADB (Android Debug Bridge) no seu ambiente: http://adbdriver.com/downloads/

Mensagem do anunciante:

Experimente a Umbler, startup de Cloud Hosting por demanda feita para agências e desenvolvedores e ganhe até R$ 100 em créditos!

ASP .NET Core – Criando uma aplicação MVC 6 Web API no VS 2015 Community – Parte 01

$
0
0

Neste artigo, vamos criar uma aplicação ASP .NET MVC 6 Web API usando o Visual Studio Community 2015. Será uma aplicação básica onde iremos realizar as operações CRUD na API Contatos.

A ASP .NET Web API é um framework que torna bem simples construir serviços HTTP que alcançam uma grande variedade de clientes como navegadores, tablets, smartphones etc, sendo ideal para criar aplicações RESTful na plataforma .NET.

Neste artigo, iremos realizar as seguintes tarefas:

  • Criar uma projeto ASP .NET Core Web API
  • Criar o modelo de domínio(Model) Contatos
  • Criar e registrar um repositório para os Contatos
  • Adicionar o Controlador
  • Definir os métodos CRUD
  • Testar A Web API

aspnc_mvc610

Recursos usados:

Criando sua primeira aplicação ASP .NET MVC 6 Web API

Abra o Visual Studio Community 2015 com update 2 e clique em New Project. Depois, selecione Visual C# e clique em Web.

Você verá a janela abaixo exibindo dois novos tipos de projetos web:

aspn_corerc221 (1)

Os dois tipos de projetos são:

  • ASP.NET Core Web Application (.NET Core) – Projeto ASP.NET Core multiplataforma (Windows, Linux e OS X) , baseado no .NET Core;
  • ASP.NET Core Web Application (.NET Framework) – Projeto ASP.NET Core que emprega o .NET Framework, apenas para o ambiente Windows.

Vamos criar um projeto ASP .NET Core Multiplataforma com o nome WebAPI_Contatos:

aspnc_mvc611

Ao clicar no botão OK, veremos na próxima janela 3 templates disponíveis:

  • Empty
  • Web API
  • Web Application

aspnc_mvc612

Marque a opção Web API sem autenticação e sem hospedagem na nuvem e clique no botão OK.

Você verá na janela Solution Explorer a seguinte estrutura do projeto criado:

aspnc_mvc613

Em destaque temos a exibição do código da classe Program.cs.

Lembra que mencionei que ASP .NET Core é uma aplicação Console? Observe que temos o método Main() onde a aplicação será configurada e executada (este método antes estava no arquivo startup.cs).

Se abrirmos o arquivo project.json veremos  a versão da ASP .NET Core e as dependências do MVC, EnvirnomentVariables, JSON e Loggingincluídas no projeto:

aspnc_mvc614

Definindo o modelo de domínio : Contato

Vamos criar a classe Contatos em uma pasta Models, que iremos criar no projeto. Será uma classe POCO bem simples.

Selecione o projeto WebAPI_Contatos e no menu Project e clique em New Folder e informe o nome Models. Agora clique com o botão direito sobre a pasta Models e a seguir em Add -> Class informando o nome Contato.cs.

Inclua o código abaixo nesta classe:

public class Contato
{
        public string Nome { get; set; }
        public string Sobrenome { get; set; }
        public bool IsParente { get; set; }
        public string Empresa { get; set; }
        public string Email { get; set; }
        public string Telefone { get; set; }
        public DateTime Nascimento { get; set; }
}

Criando o repositório de dados para os Contatos

Vamos usar o padrão repositório para desacoplar a nossa camada de acesso a dados da ferramenta ORM.

Vamos criar uma interface IContatosRepositorio na pasta Models. Para isso, selecione a pasta Models e no menu Project clique em Add New Item e selecione o template Interface informando o nomeIContatosRepositorio.

A seguir, inclua o código abaixo nesta interface:

public interface IContatosRepositorio
{
        void Adicionar(Contato item);
        IEnumerable<Contato> GetTodos();
        Contato Encontrar(string chave);
        void Remover(string Id);
        void Atualizar(Contato item);
}

Nossa interface definiu os métodos básicos para realizar as operações CRUD e que deverão ser implementadas pela classe concretaContatosRepositorio.

No menu Project, clique em Add Class e informe o nome ContatosRepositorio.cs.

Inclua o código abaixo nesta classe:

public class ContatosRepositorio : IContatosRepositorio
    {
        <strong>static List&lt;Contato&gt; ListaContatos = new List&lt;Contato&gt;();</strong>
        public void Adicionar(Contato item)
        {
             ListaContatos.Add(item);
        }
        public void Atualizar(Contato item)
        {
            var itemAtualizar = ListaContatos.SingleOrDefault(r =&gt; r.Telefone == item.Telefone);
            if (itemAtualizar != null)
            {
                itemAtualizar.Nome = item.Nome;
                itemAtualizar.Sobrenome = item.Sobrenome;
                itemAtualizar.IsParente = item.IsParente;
                itemAtualizar.Empresa = item.Empresa;
                itemAtualizar.Email = item.Email;
                itemAtualizar.Telefone = item.Telefone;
                itemAtualizar.Nascimento = item.Nascimento;
            }
        }
        public Contato Encontrar(string chave)
        {
            return ListaContatos.Where(e =&gt; e.Telefone.Equals(chave)).FirstOrDefault();
        }
        public IEnumerable&lt;Contato&gt; GetTodos()
        {
               return ListaContatos;
        }
        public void Remover(string Id)
        {
            var itemARemover = ListaContatos.SingleOrDefault(r =&gt; r.Telefone == Id);
            if (ListaContatos != null)
                ListaContatos.Remove(itemARemover);
        }
    }

Nesta classe implementamos os métodos definidos na interface.

Observe que não estamos trabalhando com um banco de dados para simplificar o projeto. Mais adiante vamos realizar a injeção de dependência usando o arquivo Startup.cs.

Criando o controlador ContatosController na pasta Controllers

Chegou a hora de definir o nosso controlador ContatosController na pasta Controllers.

Clique com o botão direito do mouse sobre a pasta Controllers e a seguir clique em Add Class e informe o nome ContatosController.cs.

Em seguida, inclua o código abaixo nesta classe:

using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
using WebAPI_Contatos.Models;
namespace WebAPI_Contatos.Controllers
{
    [Route("api/[controller]")]
    <strong>public class ContatosController : Controller</strong>
    {
        public IContatosRepositorio contatosRepo { get; set; }
        public ContatosController(<strong>IContatosRepositorio</strong> _repo)
        {
            <strong>contatosRepo = _repo;</strong>
        }
        [HttpGet]
        public IEnumerable&lt;Contato&gt; GetTodos()
        {
            return <strong>contatosRepo.GetTodos();</strong>
        }
        [HttpGet("{id}", Name = "GetContatos")]
        public IActionResult GetPorId(string id)
        {
            var item = <strong>contatosRepo.Encontrar(id);</strong>
            if (item == null)
            {
                return NotFound();
            }
            return new ObjectResult(item);
        }
        [HttpPost]
        public IActionResult Criar([FromBody] Contato item)
        {
            if (item == null)
            {
                return BadRequest();
            }
            contatosRepo.Adicionar(item);
            return CreatedAtRoute("GetContatos", new { Controller = "Contatos", id = item.Telefone }, item);
        }
        [HttpPut("{id}")]
        public IActionResult Atualizar(string id, [FromBody] Contato item)
        {
            if (item == null)
            {
                return BadRequest();
            }
            var contactObj = <strong>contatosRepo.Encontrar(id);</strong>
            if (contactObj == null)
            {
                return NotFound();
            }
            <strong>contatosRepo.Atualizar(item);</strong>
            return new NoContentResult();
        }
        [HttpDelete("{id}")]
        public void Deletar(string id)
        {
            <strong>contatosRepo.Remover(id);</strong>
        }
    }
}

Os destaques deste código são:

  1. [Route(“api/[controller]”)] – Este atributo é usado para definir um roteamento para acessar a Web API;
  2. contatosRepo – É instanciado usando uma injeção de dependência que é configurada em services.cs;
  3. GetTodos() – É um método HttpGet para obter todos os contatos;
  4. GetPorId – É um método que vai procurar um contato com base no seu número de telefone;
  5. O método Criar depois de incluir um contato retorna 201 e fornece o header de localização.

Nota: Os código do status HTTP Status são descritos como: BadReqest(), NotFound(), Unauthorized() etc.

Ajustando o arquivo Startup.cs para rodar a Web API

Qualquer Web API irá retornar JSON no formato Camel Case de forma que possamos consumir a API em qualquer cliente.

Precisamos habilitar a classeCamelCasePropertyNamesContractResolver no método ConfigureServices do arquivo Startup.cs. E precisamos também definir a injeção de dependência usada no controlador.

A seguir, vemos o arquivo Startup.cs com o código já pronto:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json.Serialization;
using WebAPI_Contatos.Models;
namespace WebAPI_Contatos
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }
        public IConfigurationRoot Configuration { get; }
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            <strong>// Adicionando servicos do framework</strong>
<strong>            services.AddMvc()</strong>
<strong>                    .AddJsonOptions(a =&gt; a.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver()); ;</strong>
<strong>            //usando a Dependency Injection</strong>
<strong>            services.AddSingleton&lt;IContatosRepositorio, ContatosRepositorio&gt;();</strong>
        }
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();
            app.UseMvc();
        }
    }
}

O código destacado em negrito foi o que incluímos no arquivo.

Na segunda parte do artigo vamos testar a nossa Web API realizando algumas operações CRUD que definimos no projeto.

Até mais!

Mensagem do anunciante:

Com a Directcall você automatiza telefonia no seu software e website em minutos! Teste grátis

ASP .NET – DropDownList: múltiplas colunas e seleção com jQuery(CDN)

$
0
0

Neste artigo, eu vou mostrar como podemos exibir mais de um valor em um controle dropdownlist e obter o valor selecionado usando jQuery com a distribuição CDN.

O controle DropDownList é um controle de lista muito versátil e simples para exibir uma lista de opções ao usuário. Para recordar, abaixo relacionei novamente as propriedades de um controle DropDownList:

  • AutoPostBack – Se for True causa um envio (post) do formulário quando o cliente altera o item selecionado;
  • DataSource – Referencia a fonte de dados que o controle usa para preencher os itens;
  • DataTextField – É usado para preencher o campo Text dos itens;
  • DataValueField – Usado para preencher o campo Value dos itens;
  • Items – Coleção de objetos ListItem onde cada objeto representa um item;
  • SelectedItem – Uma referência o item selecionado;
  • SelectedIndex – Informa o índice do item selecionado. O primeiro tem índice igual a zero.

Evento de um DropDownList: OnSelectedIndexChanged – Iniciado quando o controle tem a propriedade AutoPostBack igual a True e ocorre mudança no item selecionado.

A jQuery é a biblioteca JavaScript mais usada em aplicações web atualmente. Ela foi desenvolvida em 2006, por John Resig, e é suportada por uma comunidade de desenvolvedores além do time do projeto jQuery. Ela foi construída para ser leve, poder ser usadas nos principais navegadores e ser compatível com a especificação CSS3.

A jQuery simplifica a maneira de como acessar os elementos DOM, tornando mais fácil a navegação pelas páginas. Para usar jQuery, você pode:

  • Fazer o download da library jQuery a partir do site jQuery.com e referenciar no seu projeto;
  • Incluir a jQuery a partir de uma distribuição CDN (Content Delivery Network), como o Google ou Microsoft;

No exemplo do artigo, eu vou usar a distribuição CDN do Google que tem a seguinte sintaxe:

<script src=”https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js”></script>

Recursos usados: Visual Studio Community 2015

Nota: Baixe e use a versão Community 2015 do VS. Ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS Community 2015 e clique em New Project. Depois selecione a linguagem Visual Basic ou Visual C# e o template ASP .NET Web Application.

Informe o nome DropDownList_MultiplasColunas, ou outro de sua preferência, e clique no botão OK.

aspn_ddljq1

A  seguir, selecione o template Empty e marque a opção Web Forms, pois vamos criar um projeto vazio:

aspn_jqtab2

Em seguida, no menu Project, clique em Add New Item e selecione o template Web Form, informando o nome Default.aspx. Assim, incluímos uma página em nosso projeto.

Para obter a Jquery, podemos usar o Nuget para incluir as referências às biblioteca jQuery.

Isso é feito no menu TOOLS e em Nuget Package Manager e selecione Manage Nuget Package for Solutions.

Na janela do assistente, selecione a guia Online e informe jQuery para localizar o pacote. Selecione o pacote jQuery e clique no botão Install para instalar a biblioteca no projeto:

aspn_jqtab3

No nosso exemplo, não vamos seguir esse caminho, usando a distribuição CDN que é referenciada diretamente na página ASP .NET.

Abra a página Default.aspx no modo Source e inclua a referências na seção <head> para a biblioteca JQuery, usando a CDN do Google.

aspn_ddljq2

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DropDownList_MultiplasColunas.Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>DropDwonList - Multiplas Colunas/ Seleção com jQuery(CDN)</title>

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

    <script type="text/javascript">
        function getValorSelecionado() {
            alert($("#ddl").val());
         }
        function getTextoSelecionado() {
             alert($("#ddl option:selected").text());
         }
    </script>

</head>
<body>
    <h2>Macoratti .net - DropDownList com Múltiplas Colunas/Seleção com jQuery(CDN)</h2>
    <hr />
    <form id="form1" runat="server">
    <div>
     Selecione uma opção : <asp:DropDownList ID="ddl" runat="server" Height="27px" Width="245px" />
    </div>
    <p><asp:Button ID="btnValor" runat="server" Text="Obter o valor Selecionado" OnClientClick="return getValorSelecionado();" /></p>
    <p>
    <asp:Button ID="btnTexto" runat="server" Text="Obter o Texto Selecionado"  OnClientClick="return getTextoSelecionado();" />      
    </p>
    </form>
</body>
</html>

Na tag <head>, definimos as funções jQuery getValorSelecionado e getTextoSelecionado para obter o valor selecionado a partir do controle DropDownList(ddl).

Agora, vamos definir o código no arquivo code-behind Default.aspx.cs, usando o evento Load, para acessar a tabela Customers do banco de dadosNorthwind.mdf e obter o valores para exibir no dropdownlist.

using System;
using System.Data.SqlClient;
       SqlConnection con = null;
        protected void Page_Load(object sender, EventArgs e)
        {
            try {
                string connectionString = @"Data Source=.\sqlexpress;Initial Catalog=Northwind;Integrated Security=True";
                con = new SqlConnection(connectionString);
                SqlCommand cmd = new SqlCommand("Select CustomerID, PostalCode  + ' - ' + City as pCep from Customers", con);
                con.Open();
                SqlDataReader rd;
                rd = cmd.ExecuteReader();
                ddl.DataSource = rd;
                ddl.DataMember = "CusrtomerID";
                ddl.DataValueField = "pCep";
                ddl.DataBind();
            }
            catch(Exception ex)
            {
                throw ex;
            }
            finally
            {
                con.Close();
            }
        }

O pulo do gato para exibir mais de um valor no controle dropdownlist é montar a instrução SQL concatenando os campos com os valores que desejamos exibir.

No exemplo, fizermos isso para as colunas PostalCode e City definindo o aliás pCep para este valor.

Select CustomerID, PostalCode  + ‘ – ‘ + City as pCep from Customers

Depois, atribuímos o valor à propriedade DataValueField: ddl.DataValueField = “pCep”;

Executando o projeto, iremos obter:

aspn_ddljq3

ASP .NET MVC 5 – Criando uma aplicação com AngularJS e Web API – Parte 01

$
0
0

Neste artigo, eu vou mostrar como criar uma aplicação web usando os recursos da ASP .NET MVC 5, do AngularJS e da Web API.

Vamos criar uma loja virtual onde teremos o login do usuário, o catálogo de produtos, a manutenção dos produtos e as operações básicas de seleção e compra de produtos.

Vou começar apresentando a arquitetura da aplicação e, a seguir, apresentar os conceitos básicos sobre as tecnologias AngularJS e Web API que iremos usar em nosso projeto.

Apresentando a arquitetura do projeto web

O diagrama a seguir dá uma visão geral da arquitetura da nossa aplicação web ASP .NET MVC 5:

mvc_angapi11

No lado do servidor, vamos trabalhar com ASP .NET MVC e Web API (Restfull) e do lado do cliente, vamos trabalhar com AngularJS.

AngularJS – Conceitos

O  “AngularJS é um framework JavaScript open-source, mantido pelo Google, que auxilia na execução de Single Page Applications. Seu objetivo é aumentar aplicativos que podem ser acessados por um navegador web, sob o padrão model–view–controller (MVC), em um esforço para facilitar tanto o desenvolvimento quanto o teste dos aplicativos.

A biblioteca lê o HTML que contém tags especiais e, então, executa a diretiva a qual esta tag pertence. Também faz a ligação entre a apresentação e seu modelo, representado por variáveis JavaScript comuns. O valor dessas variáveis podem ser definidas manualmente, ou via um recurso JSON estático ou dinâmico.

O AngularJS é construído sob a ideologia de que programação declarativa deve ser usada para construção de Interfaces de Usuário e componentes de software, enquanto que a programação imperativa é excelente para escrever as regras de negócio.

O framework adapta e estende o HTML tradicional para uma melhor experiência com conteúdo dinâmico, com a ligação direta e bidirecional dos dados (two-way data-binding) que permite sincronização automática de models e views. Como resultado, AngularJS abstrai a manipulação do DOM e melhora os testes.

Um dos recursos mais importantes do AngularJS é o DataBindig que reflete a sincronização de dados entre a view e o model. Se a view mudar, o model também muda e vice-versa. Este processo é assegurado pela utilização do objeto $scope, conforme vemos no diagrama a seguir:

mvc_angapi12

O AngularJS pode ser obtido do site https://angularjs.org/. No site, você também vai encontrar recursos de aprendizagem, cursos, a referência para a API e outros recursos.

Para usar o AngularJS, podemos fazer a referência local em nosso projeto via Nuget ou usar a distribuição CDN.

Web API – Conceitos

O protocolo HTTP não precisa ser usado apenas para servir páginas. É também uma plataforma poderosa para a construção de APIs que expõem serviços e dados. O HTTP é simples, flexível e onipresente. Praticamente qualquer plataforma que você pode pensar tem uma biblioteca HTTP, então, os serviços HTTP podem atingir uma ampla gama de clientes, incluindo navegadores, dispositivos móveis e aplicações desktop tradicionais.

Uma Web API pode ser vista como um conjunto de serviços expostos via web com o objetivo de integrar sua aplicação a diversos tipos de clientes que queiram usar os serviços. Esses serviços são usados como requisições HTTP e retornam uma resposta em um formato específico como XML, REST etc.

Essa resposta pode ser uma informação de um repositório de dados, o retorno de uma operação etc. O cliente pode ser uma página web, uma aplicação desktop, uma aplicação mobile etc. Como exemplos de Web API, podemos citar as Web APIs do Facebook e Twitter.

A ASP.NET Web API é um framework para a construção de web APIs em cima do .NET Framework, permitindo que sua aplicação seja acessada por diversos clientes em diversas plataformas.

Recursos usados: Visual Studio Community 2015.

Nota: baixe e use a versão Community 2015 do VS. Ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS Community 2015 e clique em New Project. Selecione a linguagem Visual C# e o template ASP .NET Web Application.

Informe o nome Mvc_LojaVirtual ou outro de sua preferência e clique no botão OK:

mvc_angapi13

A  seguir, selecione o template MVC e marque a opção Web API e clique no botão OK:

mvc_angapi14

Para obter a AngularJS, podemos usar o Nuget para incluir as referências às biblioteca AngularJS.

Isso é feito no menu TOOLS e em Nuget Package Manager e selecione Manage Nuget Package for Solutions.

Na janela do assistente, selecione a guia Online e informe AngularJS para localizar o pacote. Depois selecione o pacote Angularjs e clique no botão Install para instalar a biblioteca no projeto:

mvc_angapi15

Podemos também usar usar a distribuição CDN, que é referenciada diretamente na página ASP .NET.

A URL da distribuição CDN pode ser obtida no site https://angularjs.org/ e é esta aqui.

Dessa forma, temos a estrutura do nosso projeto criada e pronta para que possamos incluir os recursos que precisamos para nossa loja virtual.

mvc_angapi16

Napróxima parte do artigo, vamos definir o nosso modelo de dados e criar o banco de dados, as tabelas e as stored procedures que vamos usar.

Viewing all 293 articles
Browse latest View live