Mostrando postagens com marcador André Alves Lima. Mostrar todas as postagens
Mostrando postagens com marcador André Alves Lima. Mostrar todas as postagens

quarta-feira, 27 de março de 2019

Não reinvente a roda! Utilize componentes prontos no desenvolvimento da sua aplicação

Por André Lima em 15/02/2017

Resultado de imagem para componentes de desenvolvimento C#
Embarcados

Muitos desenvolvedores não sabem da existência de bibliotecas comerciais e acabam constantemente “reinventando a roda” na hora de desenvolver as suas aplicações. Eu mesmo, lá por volta de 2005, no começo da minha carreira, não conhecia tais bibliotecas e pacotes de componentes. Ou seja, eu desenvolvia as aplicações da pequena empresa onde eu trabalhava utilizando os componentes nativos do Windows Forms.
Foi só depois de participar de uma mesa redonda no TechEd (em 2006, se não me engano) que eu ouvi falar da DevExpress e fui pesquisar exatamente o que ela tinha a oferecer. Começamos a utilizar os componentes de avaliação e a produtividade foi às alturas. Não dá para comparar a quantidade de funcionalidades disponíveis nos controles de bibliotecas comerciais com as funcionalidades dos controles nativos do .NET Framework.
É justamente por causa desse grande impacto que essa simples informação fez no desenvolvimento das nossas aplicações que eu quero compartilhar com você as 4 principais empresas que desenvolvem bibliotecas de componentes para aplicações .NET (entre outras plataformas).
Edit: depois de publicar e divulgar este artigo, várias pessoas me lembraram nos comentários (tanto aqui quanto no Facebook) da SyncFusion! Eu realmente tinha esquecido da SyncFusion, que tem até uma licença gratuita “Community” (como o Visual Studio) para desenvolvedores individuais e empresas que faturem menos que $1 milhão por ano.
Só para deixar claro, não existem somente essas empresas que vendem componentes prontos para o desenvolvimento de aplicações .NET. Essas são, na minha opinião, as 4 empresas mais conhecidas do segmento. Caso você utilize componentes de alguma outra empresa, deixe o seu comentário no final do artigo.
Ah, outro detalhe: esse não é um post patrocinado. Ou seja, não estou ganhando absolutamente nada dessas empresas para fazer essa divulgação. Só estou divulgando porque, como falei anteriormente, essa informação teve um grande impacto nas aplicações que desenvolvemos dali para a frente.

DevExpress

A DevExpress foi a primeira empresa desse ramo que eu tive contato. Na empresa onde eu trabalhava na época eu baixei os componentes de avaliação e fiquei maravilhado com as suas funcionalidades. O destaque vai para o famoso grid, que possui nativamente as funcionalidades de ordenação, remoção e adição de colunas, filtros, mestre/detalhe, drilldown, agrupamentos, entre outras:
E não é só o grid que faz sucesso. O pacote de componentes da DevExpress conta também com controles de layout (possibilitando que o usuário altere o layout das telas e salve para a próxima execução), gráficos, ribbon, skins, entre outros. Dá uma olhada nas plataformas suportadas no momento:
E quanto é que custa tudo isso? Bom, não é barato. No momento da escrita deste artigo (fevereiro de 2017), se você for comprar as plataformas separadamente (por exemplo, só Windows Forms ou só WPF ou só ASP.NET), elas custarão entre $500 e $900, dando o direito de suporte e atualizações por um ano. Depois disso, se você quiser continuar com o suporte e novas atualizações, você tem que renovar a cada ano (por um preço menor).
Existe também a opção de você comprar os componentes de todas as plataformas .NET (Windows Forms, ASP.NET, WPF e UWP) por $1500. Por fim, tem a opção “super master blaster” onde você compra todos os componentes possíveis da DevExpress (inclusive os componentes para HTML5 e JavaScript) pela bagatela de $2200.
Fundada em: 1998
Versão Trial: 30 dias

Telerik

A Telerik é a empresa mais conhecida no meio dos desenvolvedores, uma vez que ela costuma patrocinar diversos eventos e ações da comunidade. Por exemplo, a Telerik foi patrocinadora do podcast .NET Rocks por anos e anos (hoje em dia, ironicamente, é a DevExpress que patrocina). Eu até tenho um bonequinho ninja da Telerik na minha mesa da empresa, que eu ganhei no primeiro TechEd que eu participei (a Telerik normalmente tinha estandes e patrocinava esse tipo de evento).
Um dos componentes mais conhecidos da Telerik é o seu grid, que é tão poderoso quanto o da DevExpress:
Além disso, o pacote de componentes da Telerik também conta com diversos outros controles bem interessantes, como gráficos, editor RichText, controle visualizador de PDF, etc. As plataformas suportadas também vão desde o Windows Forms até o UWP, passando por WPF, ASP.NET e Xamarin:
E o preço? No momento da escrita deste artigo (fevereiro de 2017), plataformas separadas estão saindo entre $400 e $1000, também com updates e suporte por 1 ano. Já a opção com todas as plataformas (tirando Xamarin) sai por $1500 e o pacote completo custa $2200.
Fundada em: 2002
Versão Trial: 30 dias

Infragistics

Confesso a você que logo quando eu comecei a participar de eventos da comunidade (lá por volta de 2004, 2005) eu ouvi bastante o nome “Infragistics“, mas nunca tive curiosidade sequer de procurar o que isso queria dizer. Eu tenho a impressão que as pessoas sempre reclamavam da Infragistics, mas pode ser que eu esteja errado. Com o passar dos anos eu acabei descobrindo que a Infragistics era, na verdade, mais uma empresa que desenvolvia componentes para auxiliar no desenvolvimento de aplicações.
Alguns projetos legados aqui na empresa onde eu trabalho utilizam controles da Infragistics, principalmente o grid:
Assim como as outras empresas apresentadas neste artigo, a Infragitics também suporta uma variedade de plataformas, como Windows Forms, WPF, ASP.NET, Xamarin e UWP:
Componentes de uma plataforma específica custam, no momento da escrita deste artigo (fevereiro de 2017), entre $500 e $900. Já o pacote com os componentes para todas as plataformas sai por $1500.
Fundada em: 1989
Versão Trial: 30 dias

ComponentOne

Eu confesso que tive pouca experiência com os controles da ComponentOne, mas dentre as quatro opções apresentadas neste artigo, ela parece ser a menos robusta. No passado eu cheguei a utilizar de leve os componentes de acesso a dados da ComponentOne, que permitiam o compartilhamento “fácil” de schemas de bancos de dados diferentes. Isso é primordial caso a sua aplicação tenha que rodar apontando para bancos de dados diferentes (como SQL Server e Oracle, por exemplo).
Dando uma olhada nas imagens de exemplo dos controles da ComponentOne, já dá para perceber que ele fica em uma categoria um pouco inferior quando comparamos com os controles da DevExpress, Telerik ou Infragistics. Por exemplo, veja só o grid da ComponentOne:
As plataformas suportadas são basicamente as mesmas das outras empresas:
Eu imaginei que os preços da ComponentOne seriam menores, mas não, eles ficam na casa de $900 a $1100. Existe um combo de componentes .NET desktop + web que sai por $1500 e um outro combo que inclui também os componentes HTML5, JavaScript e desenvolvimento móvel por $2000.
Fundada em: 2000
Versão Trial: 30 dias

SyncFusion

Depois de publicar e divulgar este post, diversas pessoas vieram me lembrar nos comentários sobre os controles da SyncFusion. Eu realmente tinha esquecido deles. E olha que nós usamos os ícones “metro style” da SyncFusion em um dos nossos aplicativos aqui na empresa onde eu trabalho.
A qualidade dos controles da SyncFusion é muito boa, compatível com a qualidade das outras bibliotecas apresentadas anteriormente neste artigo. Veja só um exemplo do grid da SyncFusion:
Aqui vai uma lista das plataformas suportadas atualmente:
O grande diferencial da SyncFusion é que ela possui uma edição gratuita “Community“, igual o Visual Studio. A edição é totalmente gratuita para desenvolvedores individuais e empresas que faturem menos de $1 milhão por ano. Além disso, ela oferece também as edições comerciais, que custam atualmente em média $1000 por plataforma ou $4000 para todas as plataformas.
Fundada em: 2001
Versão Trial: 30 dias
Versão Community: gratuita para desenvolvedores individuais ou empresas com faturamento até $1 milhão por ano

Concluindo

A grande mensagem que eu quero passar com este artigo é: se a sua aplicação tem uma demanda por controles complexos, não reinvente a roda! Existem diversas empresas que desenvolvem controles comerciais que podemos utilizar nas nossas aplicações, como as quatro que eu apresentei neste artigo.
Não importa qual delas você escolha, o que importa é que você não fique perdendo tempo e dinheiro desenvolvendo controles por conta própria. Faça uso desses excelentes controles desenvolvidos por terceiros, que contam com suporte e atualizações constantes.
Vamos fazer uma conta rápida aqui? Imagine que você tenha um desenvolvedor ganhando R$3000 por mês na sua empresa. Aí você pega esse funcionário e coloca ele para desenvolver uma funcionalidade extra no controle de grid do .NET. Se esse desenvolvedor trabalhar duas semanas e meia no desenvolvimento e suporte desse grid, o custo sairia basicamente o mesmo se você tivesse pago os $600, que é o que custa em média o pacote de controles para uma única plataforma das empresas abordadas nesse artigo. Não precisa nem falar o que compensa mais, não é mesmo?
Se você ainda não utiliza esses tipos de controles nos seus projetos ou na sua empresa, faça o download das versões trial, teste e veja você mesmo a quantidade de tempo que a sua empresa conseguiria reduzir no desenvolvimento das suas aplicações. Depois volta aqui e fala pra gente os resultados na caixa de comentários. E se você já utiliza ou utilizou esses ou outros componentes pagos nas suas aplicações, conta pra gente como é que foi a sua experiência também.
Por fim, convido você a inscrever-se na minha newsletter. Ao fazer isso, você receberá um e-mail toda semana sobre o artigo publicado e ficará sabendo também em primeira mão sobre o artigo da próxima semana, além de receber dicas “bônus” que eu só compartilho por e-mail. Inscreva-se utilizando o formulário logo abaixo.

segunda-feira, 21 de agosto de 2017

Enviando e-mails com C#


Hoje em dia é muito comum termo que implementar o envio de e-mails através dos nossos aplicativos. Quando desenvolvemos uma aplicação utilizando o .NET Framework, essa necessidade é facilmente suprida, uma vez que o próprio .NET Framework contém classes que implementam o envio de e-mails. Confira neste artigo como enviar e-mails com C#.
As classes responsáveis pelo envio de e-mails no .NET Framework são a SmtpClient e MailMessage. Como o próprio nome já diz, a classe SmtpClient implementa as funcionalidades de SMTP (Simple Mail Transfer Protocol), que justamente é a responsável por fazer o envio do e-mail em si. Já a classe MailMessage representa uma mensagem de e-mail, com todas as propriedades que um e-mail contém, como, por exemplo, assunto, endereços do remetente e destinatário, etc.
Para aprendermos como funciona o envio de e-mails com essas classes, vamos criar um novo projeto do tipo Windows Forms. Nesse novo projeto, renomeie “Form1” para “FormEnviarEmail” e adicione alguns controles (basicamente Labels, TextBoxes, um Button e um RichTextBox – para digitarmos o conteúdo do e-mail), de forma que ele fique parecido com a imagem a seguir.
Feito isso, podemos implementar o código que fará o envio do e-mail no clique do botão “Enviar“.

Configurando o SmtpClient para funcionar com o Gmail

O primeiro passo que temos que seguir para enviarmos e-mails no C# é criarmos e configurarmos um SmtpClient. Esse SmtpClient terá todas as informações relacionadas ao servidor SMTP que fará o envio do e-mail. Você pode utilizar o servidor SMTP que quiser, mas, como é muito comum que qualquer pessoa tenha um e-mail do Gmail, vamos conferir neste artigo como configurar o SmtpClient para utilizar o SMTP do Gmail com as suas credenciais.
As propriedades que temos que configurar no SmtpClient são: HostPortEnableSslUseDefaultCredentials e Credentials. A propriedade “Host” representa o endereço do servidor SMTP e a propriedade “Port” representa a porta que o servidor SMTP utiliza (por padrão “25“). Já as outras propriedades (“EnableSsl“, “UseDefaultCredentials” e “Credentials“) servem para realizar a autenticação no servidor.
O endereço do servidor SMTP do Gmail é “smtp.gmail.com“, e a porta utilizada pelo Gmail não é a padrão (25), mas sim, a porta 587. A página de ajuda do Gmail apresenta todas essas informações para você:
Um erro que eu cometi durante os meus testes foi utilizar a porta 465 ao invés da porta 587 (talvez enganado pelas informações deste link). Como na documentação estava escrito “Porta para SSL“, achei que essa fosse a porta que eu deveria utilizar, mas, na realidade, a porta que precisamos utilizar no SmtpClient é a “Porta para TLS“.
Uma vez configuradas as propriedades “Host” e “Port“, temos que configurar a propriedade “EnableSsl” para “true“, a propriedade “UseDefaultCredentials” para “false” e a propriedade “Credentials” com as credenciais da sua conta do Gmail. Confira abaixo como fica o trecho de código com a configuração do SmtpClient:
1
2
3
4
5
6
7
8
using (System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient())
{
    smtp.Host = "smtp.gmail.com";
    smtp.Port = 587;
    smtp.EnableSsl = true;
    smtp.UseDefaultCredentials = false;
    smtp.Credentials = new System.Net.NetworkCredential("SEUEMAIL@gmail.com", "SUASENHA");
}
Atenção! É importante que a configuração da propriedade “UseDefaultCredentials” seja feita antes da configuração da propriedade “Credentials“. Se você inverter essas duas linhas, você receberá o seguinte erro:
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required.
Isso acontece porque, ao configurarmos a propriedade “UseDefaultCredentials” para “false“, o .NET Framework automaticamente faz um “reset” da propriedade “Credentials“, ou seja, ela será alterada para “null“. Portanto, temos que configurar as “Credentials” depois de ter alterado a propriedade “UseDefaultCredentials“.
Encontrei essa informação em um post no StackOverflow:

Construindo o MailMessage

Agora que já configuramos o SmtpClient, temos que criar um MailMessage, configurar suas propriedades e passá-lo ao método Send do SmtpClient. As propriedades que vamos configurar são: FromToCCBccSubject e Body. Veja como fica o resultado no trecho de código abaixo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using (System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage())
{
    mail.From = new System.Net.Mail.MailAddress("SEUEMAIL@gmail.com");
 
    if (!string.IsNullOrWhiteSpace(textBoxPara.Text))
    {
        mail.To.Add(new System.Net.Mail.MailAddress(textBoxPara.Text));
    }
    else
    {
        MessageBox.Show("Campo 'para' é obrigatório.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
    if (!string.IsNullOrWhiteSpace(textBoxCC.Text))
        mail.CC.Add(new System.Net.Mail.MailAddress(textBoxCC.Text));
    if (!string.IsNullOrWhiteSpace(textBoxCCo.Text))
        mail.Bcc.Add(new System.Net.Mail.MailAddress(textBoxCCo.Text));
    mail.Subject = textBoxAssunto.Text;
    mail.Body = richTextBoxCorpo.Text;
}
Observe que a única particularidade do código acima é que os endereços de e-mail não são simplesmente strings, mas sim, instâncias de MailAddress.
O único detalhe que está faltando para que o e-mail seja enviado é a chamada do método “Send” do SmtpClient. Nele passaremos a MailMessage que acabamos de criar:
1
smtp.Send(mail);

Anexando arquivos

Para anexarmos arquivos à nossa mensagem, basta utilizarmos a propriedade Attachments da classe MailMessage. Porém, antes de conferirmos como fica o código, vamos alterar um pouco a nossa janela, adicionando uma ListBox e um botão para escolhermos os arquivos a serem anexados ao e-mail:
Confira abaixo o código a ser utilizado no evento “Click” do botão “Adicionar“:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void buttonAdicionarAttachment_Click(object sender, EventArgs e)
{
    using (OpenFileDialog dialog = new OpenFileDialog())
    {
        dialog.Multiselect = true;
 
        if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            foreach (var file in dialog.FileNames)
            {
                listBoxAttachments.Items.Add(file);
            }
        }
    }
}
Como você pode ver, é um código muito simples. Nós utilizamos a classe OpenFileDialog para selecionarmos um ou mais arquivos (note que a propriedade MultiSelect foi alterada para “true” a fim de possibilitarmos a escolha de mais de um arquivo) e, caso o usuário confirme o diálogo, nós preenchemos o ListBox com os caminhos para os arquivos escolhidos. Uma solução mais robusta seria possibilitar o drag and drop de arquivos diretamente do Windows Explorer para dentro desse ListBox. Você pode conferir como implementar essa funcionalidade no meu artigo sobre drag and drop em aplicações Windows Forms com C#.
Feito isso, adicione estas três linhas de código antes da chamada do método “Send” para que os arquivos sejam adicionados à mensagem de e-mail:
1
2
3
4
5
6
foreach (string file in listBoxAttachments.Items)
{
    mail.Attachments.Add(new System.Net.Mail.Attachment(file));
}
 
smtp.Send(mail);
E com isso podemos anexar arquivos ao nosso e-mail clicando no botão “Adicionar“.

Formatação HTML

Por padrão, a classe MailMessage utiliza o formato “texto” para as mensagens de e-mail. Porém, essa classe suporta também o envio de mensagens no formato HTML. Pensando nisso, eu resolvi substituir o controle RichTextBox por um controle que suportasse a formatação HTML.
Encontrei uma opção gratuita, chamada “ModelText HTML Edit Control“, porém, sua API é tão estranha e a documentação tão ruim que não consegui fazer com que esse controle funcionasse. Outra opção gratuita que encontrei foi um editor HTML postado no blog de um funcionário da Microsoft, mas, como achei ele extremamente complicado de utilizar, achei que nem valesse a pena o esforço. Encontrei também outras duas – opções que achei complicadas demais. Portanto, minha sugestão: se você precisar de um controle HTML na sua aplicação, separe bastante tempo para analisar essas opções gratuitas ou compre um controle comercial (como SpiceLogic .NET Win HTML Editor ControlXStandard Editor ou DevExpress RichEdit – esse último utilizamos na empresa onde eu trabalho).
A segunda ideia que tive para contornar esse problema foi: será que não tem como converter o RTF do RichTextBox em HTML? Após pesquisar, encontrei este exemplo de código que mostra como converter RTF para HTML. Resolvi dar uma chance e tentar utilizá-lo. Compilei a biblioteca, adicionei uma referência ao projeto e alterei a configuração da propriedade “Body” da MailMessage para fazer a conversão do conteúdo do RichTextBox de RTF em HTML:
1
mail.Body = MarkupConverter.RtfToHtmlConverter.ConvertRtfToHtml(richTextBoxCorpo.Rtf);
Porém, apesar do resultado ter sido animador, o e-mail ainda foi enviado em formato texto.
Isso aconteceu porque eu esqueci de alterar a propriedade IsBodyHtml para “true” antes de configurar o HTML no “Body” da MailMessage. Ao resolver esse detalhe, o resultado foi um pouco diferente (mas, nada animador):
1
2
mail.IsBodyHtml = true;
mail.Body = MarkupConverter.RtfToHtmlConverter.ConvertRtfToHtml(richTextBoxCorpo.Rtf);
Repare na barra de rolagem na imagem acima. Não sei porque, mas, o HTML convertido ficou com inúmeros espaços entre uma linha e outra.
Depois desse fracasso, resolvi desistir de enviar o e-mail no formato HTML com essas opções gratuitas. Se você tiver essa necessidade na sua aplicação, eu sugiro que você compre um controle que suporte edição HTML.

Envio assíncrono de e-mails

Ao utilizarmos o método “Send” da classe SmtpClient, o envio será feito de forma síncrona, ou seja, a interface ficará bloqueada enquanto o e-mail estiver sendo enviado. Porém, a classe SmtpClient suporta duas modalidades para envio de e-mail assíncrono: os métodos SendAsync ou SendMailAsync. A diferença entre esses dois métodos (como você pode conferir nesta discussão no StackOverflow) é que o método “SendAsync” utiliza o esquema de “call-backs“. Já o método “SendMailAsync” utiliza o esquema dos operadores async/await. Se você tiver a possibilidade de utilizar async e await na sua aplicação, eu recomendo que você considere a opção “SendMailAsync“, que é muito mais simples.
Confira como ficou o código final, ajustado para que o e-mail seja enviado de forma assíncrona utilizando o método “SendMailAsync“:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private async void buttonEnviar_Click(object sender, EventArgs e)
{
    using (System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient())
    {
        smtp.Host = "smtp.gmail.com";
        smtp.Port = 587;
        smtp.EnableSsl = true;
        smtp.UseDefaultCredentials = false;
        smtp.Credentials = new System.Net.NetworkCredential("SEUEMAIL@gmail.com", "SUASENHA");
 
        using (System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage())
        {
            mail.From = new System.Net.Mail.MailAddress("SEUEMAIL@gmail.com");
 
            if (!string.IsNullOrWhiteSpace(textBoxPara.Text))
            {
                mail.To.Add(new System.Net.Mail.MailAddress(textBoxPara.Text));
            }
            else
            {
                MessageBox.Show("Campo 'para' é obrigatório.", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (!string.IsNullOrWhiteSpace(textBoxCC.Text))
                mail.CC.Add(new System.Net.Mail.MailAddress(textBoxCC.Text));
            if (!string.IsNullOrWhiteSpace(textBoxCCo.Text))
                mail.Bcc.Add(new System.Net.Mail.MailAddress(textBoxCCo.Text));
            mail.Subject = textBoxAssunto.Text;
            mail.Body = richTextBoxCorpo.Text;
 
            foreach (string file in listBoxAttachments.Items)
            {
                mail.Attachments.Add(new System.Net.Mail.Attachment(file));
            }
 
            await smtp.SendMailAsync(mail);
        }
    }
}
Note que as únicas diferenças são: alteramos a chamada de “Send” para “SendMailAsync“; adicionamos a palavra-chave “await” antes da chamada de “SendMailAsync“; adicionamos a palavra-chave “async” na assinatura do método.

Concluindo

Hoje em dia, envio de e-mails é uma funcionalidade muito comum nas aplicações de negócios. Para a nossa sorte, a Microsoft disponibiliza classes no .NET Framework que implementam essa funcionalidade. Nesse artigo você conferiu como enviar e-mails com as classes SmtpClient e MailMessage, incluindo a possibilidade de anexar arquivos nas mensagens e fazer o envio de forma assíncrona. Você acompanhou também a minha luta (perdida) ao tentar utilizar editores gratuitos que suportassem o formato HTML (ou até mesmo a conversão de RTF para HTML). Agora, não perca tempo e implemente essa funcionalidade nos seus aplicativos, caso seja pertinente!
E, para finalizar, caso você queira ficar por dentro das novidades do meu site, assine a minha newsletter. Com ela você recebe um e-mail por semana comentando o artigo publicado, além de ficar sabendo em primeira mão sobre o artigo da próxima semana e também receber dicas exclusivas que eu só compartilho por e-mail. Assine utilizando este link ou o formulário abaixo.
Até a próxima!
André Lima