Arquivos do Blog

Como Formatar Datas com string.Format no C#

Este exemplo abaixo, mostra como podemos formatar um objeto de data DateTime em diversos formatos usando o String.Format.

Quando trabalhamos com data, às vezes é necessário o uso de formatos de data customizados, como por exemplo, uma data no formato mm/yyyy de uma fatura, uma data de um chamado aberto sem os segundos, ou ainda uma data por extenso para o rodapé de um relatório.

Para criar os formatos de data customizados, usamos algumas letras específicas onde cada letra significa uma parte da data. y (ano), M (mês), d (dia), h (hora 12), H (hora 24), m (minuto), s (segundo), f (fração de segundo), F (fração de segundo, mostrando zeros após a unidade inteira ex: 0.2000), t (P.M ou A.M) e z (time zone).

// Criando uma data 09/03/2008 16:05:07.123
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);

String.Format("{0:y yy yyy yyyy}", dt);  // "8 08 008 2008"    ano
String.Format("{0:M MM MMM MMMM}", dt);  // "3 03 Mar Março"   mês
String.Format("{0:d dd ddd dddd}", dt);  // "9 09 Dom Domingo" dia
String.Format("{0:h hh H HH}",     dt);  // "4 04 16 16"       hora 12/24
String.Format("{0:m mm}",          dt);  // "5 05"             minuto
String.Format("{0:s ss}",          dt);  // "7 07"             segundo
String.Format("{0:f ff fff ffff}", dt);  // "1 12 123 1230"    fração de segundo
String.Format("{0:F FF FFF FFFF}", dt);  // "1 12 123 123"     fração de segundo sem zero
String.Format("{0:t tt}",          dt);  // "P PM"             A.M. ou P.M.
String.Format("{0:z zz zzz}",      dt);  // "-6 -06 -06:00"    time zone

Quando usamos o separados de data “/” e o separador de tempo “:” eles serão substituídos pelo separador de data e de tempo definidos na cultura atual com o DateTimeForma­tInfo.DateSepa­rator e o DateTimeForma­tInfo.TimeSepa­rator.

// a cultura alemã substitui o separador de data "/" pelo "."
String.Format("{0:d/M/yyyy HH:mm:ss}", dt); // "9/3/2008 16:05:07" - Português Brasileiro (pt-BR)
String.Format("{0:d/M/yyyy HH:mm:ss}", dt); // "9.3.2008 16:05:07" - Alemã (de-DE)

AuthorizationAttribute Customizado no ASP.NET MVC

Vou mostrar um exemplo prático de como podemos criar um AuthorizationAttribute customizado para, por exemplo, redirecionar para uma página específica em caso de acesso não autorizado.

using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1.FilterAttributes
{
    public class MyAuthorizationAttribute : ActionFilterAttribute
    {
        private string _userName;

        public MyAuthorizationAttribute(string userName)
        {
            _userName = userName;
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            if (!UserIsAuthenticated())
            {
                // Redirect to login page
                filterContext.Result = new RedirectToRouteResult(
                    new RouteValueDictionary
                    {
                        { "controller", "Login" },
                        { "action", "NaoPermitido" }
                    });
            }
        }

        private bool UserIsAuthenticated()
        {
            return HttpContext.Current.User.Identity.Name == _userName;
        }
    }
}

Para usar fazemos assim:

[MyAuthorization("Pedro")]
public ActionResult Teste() ...

Se o nome do usuário logado não for Pedro, será redirecionado para o controller Login e a action NaoPermitido.

Sum com Linq e valores Nullable

Vamos imaginar a seguinte situação.

Temos uma lista de produtos com nome e valor, o valor do produto pode ser nulo:

public class Produto {
	public string Nome { get; set; }
	public decimal? Valor { get; set; }
}

vamos agora tentar obter o valor total dos produtos:

List lista = db.GetProdutos();
decimal soma = lista.Sum(c => c.Valor);

Ao rodar o código, se houver um produto com valor nulo, tomamos um erro.
The cast to value type ‘Decimal’ failed because the materialized value is null. Either the result type’s generic parameter or the query must use a nullable type.
Como resolver este problema?
Para resolver é bem simples, precisamos apenas usar um comando muito útil no C# e que pouca gente conhece, o Null Coalescing (??):

decimal soma = lista.Sum(c => c.Valor ?? 0);

ou com Linq:

decimal soma = (from p in lista
              select p.Valor ?? 0).Sum();

No exemplo acima, com o ?? estou dizendo que é para retornar o Valor diferente de nulo ou 0, Semelhante ao If abaixo:
(p.Valor != null) : p.Valor ? 0

Segue abaixo um código completo mostrando o funcionamento da dica, basta criar um novo projeto Console Application e inserir o código abaixo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class Produto
    {
        public string Nome { get; set; }
        public decimal? Valor { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            List<Produto> lista = new List<Produto>();
            lista.Add(new Produto
            {
                Nome = "Teste 1",
                Valor = (decimal)54.2
            });
            lista.Add(new Produto
            {
                Nome = "Teste 2",
                Valor = null
            });
            lista.Add(new Produto
            {
                Nome = "Teste 3",
                Valor = 65
            });

            decimal soma = (from p in lista
                            select p.Valor ?? 0).Sum();

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

Como Redimensionar Imagens em C#

Olá a todos,

Hoje vou mostrar como podemos redimensionar imagens no C#, é bem simples. Observe o código abaixo e siga conforme os comentários:

//Carrega uma imagem do disco
Image imageToResize = Image.FromFile(@"C:\DiretorioDaImagem\Imagem.jpg");

//Nova altura da imagem
float novaAltura =  768;
//Nova largura da imagem
float novaLagura = 1024;

//Cria um novo objeto do tipo Bitmap, é esse objeto que irá renderizar a imagem redimensionada
Bitmap novaImagem = new Bitmap((int)novaAltura, (int)novaLagura);

//Cria um objeto Graphics a partir do objeto Bitmap criado.
Graphics g = Graphics.FromImage((Image)novaImagem);
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
//Renderiza a imagem no objeto Bitmap já com a nova largura e altura
g.DrawImage(imageToResize, 0, 0, novaLagura, novaAltura);
g.Dispose();

//Salva a nova imagem no disco
novaImagem.Save(@"C:\DiretorioOndeSeraSalvo\Imagem.jpg");

Padrões de Projeto em C#. Parte I: Singleton

E ai pessoal, hoje vou começar uma série de artigos ensinando a implementar diversos padrões de projeto, ou design patterns no C#.

Hoje vou falar do Singleton.

Singleton, é um termo inglês que expressa quando resta apenas uma carta nas mãos em um jogo de baralho. É exatamente isso que é o papel do Singleton em um projeto de software, permitir apenas uma instância de um objeto naquele escopo de execução do software.

Onde devo usar?

É interessante implementar o Singleton quando precisamos garantir que existirá apenas uma instância de um objeto, geralmente usado em objetos de banco de dados para evitar abrir conexões em excesso ou para objetos responsáveis pelo log da aplicação.

Para mais detalhes sobre o Singleton, consulte a página da Wikipédia sobre Singleton clicando aqui

Vamos criar nossa classe Singleton, em meu exemplo vou simular uma classe de conexão com o banco de dados chamada ConexaoSingleton:

public sealed class ConexaoSingleton
{
   private static readonly ConexaoSingleton = new ConexaoSingleton();

   private ConexaoSingleton(){}

   public static ConexaoSingleton Instance
   {
      get
      {
         return instance;
      }
   }
}

O construtor da classe é protegido e o objeto só pode ser instanciado por ele mesmo.
Em toda a aplicação, sempre que fizer ConexaoSingleton.Instance, a classe irá retornar a mesma instância da classe ConexaoSingleton

Como Trabalhar com Repositório Genérico no Entity Framework

Olá a todos, hoje vou escrever um post falando como podemos implementar um Repositório Genérico usando o Entity Framework.

Primeiramente para quem ainda não sabe, irei explicar resumidamente o que é um repositório.

O Repositório ou Repository, é um objeto geralmente associado a um objeto de negócio como um objeto cliente, por exemplo, responsável por acessar a base de dados, como no exemplo abaixo:

Objeto de negócio:

public class Cliente
{
	public int Id {get; set; }
	public int Nome {get; set; }
}

Repositório:

public class RepositorioCliente
{
	public void Adiciona(Cliente cliente)
	{
	}

	public void Edita(Cliente cliente)
	{
	}

	public Cliente ObtemPorId(int Id)
	{
	}

	public void Deleta(Cliente cliente)
	{
	}
}

Para usar faríamos assim:

repositorioCliente repositorio = new RepositorioCliente();
repositório.Adiciona(Cliente);

Seguindo o exemplo acima, em um sistema mais complexo teríamos que criar um RepositorioFornecedor, um RepositorioFatura etc.. criando os respectivos métodos de acesso a dados para cada repositório.

Vamos então implementar um repositório genérico, isto é, um repositório padrão
que terá os métodos de criar, editar, deletar e obter onde precisamos apenas
informar qual objeto de negócio desejamos trabalhar no repositório genérico.

Vamos lá, primeiro vamos criar uma interface IRepositorio:

public interface IRepositorio<T> where T : class
{
	void Adicionar(T item);
	void Remover(T item);
	void Editar(T item);
	T ObtemPorId(object id);
	IQueryable Tudo();
}

Note que a interface possui um parâmetro genérico T, iremos tipar o repositório para o objeto de negócio que desejamos usar.

Vamos agora criar o repositório genérico:

public class Repositorio<T> : IDisposable, IRepositorio where T : class
{
	protected readonly DbContext contexto;

	public Repositorio(DbContext contexto)
	{
		this.contexto = contexto;
	}

	public virtual void Adicionar(T item)
	{
		contexto.Set<T>().Add(item);
		contexto.SaveChanges();
	}

	public virtual void Remover(T item)
	{
		contexto.Set<T>().Remove(item);
		contexto.SaveChanges();
	}

	public virtual void Editar(T item)
	{
		contexto.Entry(item).State = EntityState.Modified;
		contexto.SaveChanges();
	}

	public virtual T ObtemPorId(object id)
	{
		return contexto.Set<T>().Find(id);
	}

	public virtual IQueryable Tudo()
	{
		return contexto.Set<T>();
	}

	public void Dispose()
	{
		contexto.Dispose();
	}
}

Simples, agora para usar fazemos o seguinte:

using (IRepositorio repositorio = new Repositorio<Cliente>())
{
	repositorio.Adiciona(objetoCliente);
}

Ou para uma consulta com LINQ:

using (IRepositorio repositorio = new Repositorio<Cliente>())
{
	var lista = from p in repositório.Tudo()
				select p;
}

Com este exemplo podemos ver o potencial que o Entity Framework nos oferece para acesso a dados.

Observação:
É importante o método Tudo() ser do tipo IQueryable, dessa forma o IQueryable armazena as operações que estamos fazendo nele com o LINQ e executa a consulta no banco de dados apenas quando vamos acessar os dados.

Como Enviar Email Usando C#

Vou mostrar de maneira simples como podemos enviar email no C# através da classe MailMessage que está no namespace System.Net.Mail.


System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
message.To.Add("destinatario@email.com");
message.Subject = "Assunto do email";
message.From = new System.Net.Mail.MailAddress("remetente@email.com");
message.Body = "Corpo da mensagem";
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("servidor smtp");
smtp.Send(message);

Lista de destinatários da mensagem:

message.To.Add("destinatario@email.com");

Assunto

message.Subject = "Assunto do email";

Remetente, usamos o objeto MailAddress

message.From = new System.Net.Mail.MailAddress("remetente@email.com");

Corpo da mensagem, é o conteúdo do email

message.Body = "Corpo da mensagem";

Criamos uma instância do objeto SmtpClient que será o objeto responsável por enviar a mensagem, através do método Send()

System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("servidor smtp");
smtp.Send(message);

ASP.NET MVC 4 e Programação Assíncrona

Execução assíncrona é o futuro do desenvolvimento de aplicações para Windows

Nas versões anteriores do ASP.NET MVC era possível criar Controllers assíncronos herdando a classe AsyncController e usando algumas convenções:

MyActionAsync: método que retorna void e lança um processo assíncrono
MyActionCompleted: método que retorna um ActionResult (neste caso será o resultado da Action MyAction)

Para permitir que o MVC gerencie operações assíncronas e passe o resultado para a View, os desenvolvedores tinham que usar o AsyncManager do AsyncController.

Por exemplo, o controller abaixo permite obter uma lista de filmes serializada em Json de forma assíncrona a partir de um serviço OData:

public class MoviesController : AsyncController
{
    public ActionResult Index()
    {
        return View();
    }

    public void GetJsonMoviesAsync(int? page)
    {
        const int pageSize = 20;
        int skip = pageSize * ((page ?? 1) - 1);
        string url = string.Format("http://odata.netflix.com/[…]&$skip={0}&$top={1}",
            skip, pageSize);

        //a operação assíncrona é declarada
        AsyncManager.OutstandingOperations.Increment();

        var webClient = new WebClient();
        webClient.DownloadStringCompleted += OnWebClientDownloadStringCompleted;
        webClient.DownloadStringAsync(new Uri(url));//o processo assíncrono inicia
    }

    private void OnWebClientDownloadStringCompleted(object sender,
        DownloadStringCompletedEventArgs e)
    {
	// O processo assíncrono termina
        // "movies" o resultado é adicionado aos parâmetros da AsyncManager
        // Método GetJsonMoviesCompleted
        List<Movie> movies = null;
        if (AsyncManager.Parameters.ContainsKey("movies"))
        {
            movies = (List<Movie>)AsyncManager.Parameters["movies"];
            movies.Clear();
        }
        else
        {
            movies = new List<Movie>();
            AsyncManager.Parameters["movies"] = movies;
        }

        movies.AddRange(Movie.FromXml(e.Result));

        //Fim da operação assíncrona (chama a Action Completed)
        AsyncManager.OutstandingOperations.Decrement();
    }

    public ActionResult GetJsonMoviesCompleted(List<Movie> movies)
    {
        //Retorna o resultado em Json
        return Json(movies, JsonRequestBehavior.AllowGet);
    }
}

Veja agora como podemos criar a mesma operação assíncrona acima, usando o ASP.NET MVC 4 e o C# 5 com as novas palavras chaves async e await, bem mais simples!:

public class MoviesController : AsyncController
{
    public ActionResult Index()
    {
        return View();
    }

    public async Task<ActionResult> GetJsonMovies(int? page)
    {
        const int pageSize = 20;
        int skip = pageSize * ((page ?? 1) - 1);
        string.Format("http://odata.netflix.com/[…]&$skip={0}&$top={1}",
                    skip, pageSize);

        var webClient = new WebClient();
        string xmlResult = await webClient.DownloadStringTaskAsync(url);
        return Json(Movie.FromXml(xmlResult), JsonRequestBehavior.AllowGet);
    }
}

Como você pode ver no código acima, no ASP.NET MVC 4 continua necessário herdar a classe AsyncController mas não há mais convenções de nomenclatura usando métodos Completed/Async

Fonte: http://www.juliencorioland.net/Archives/en-aspnet-mvc-4-asynchronous-controllers

O que é o Domínio de Aplicativo (Application Domain)?

Na Common Language Runtime (CLR), um Domínio de Aplicativo é um mecanismo (similar a um processo em um sistema operacional) usado para isolar aplicações em execução uma das outras para que elas não afetem umas as outras.

O domínio de aplicativo da Common Language Runtime está contido dentro de um processo do sistema operacional. Um processo pode conter muitos domínios de aplicativo.

Domínios de aplicativo têm propriedades de isolamento semelhantes as de processos do sistema operacional:

  • Múltiplas threads podem existir dentro de um único domínio de aplicativo.
  • Um aplicativo em um domínio pode ser interrompida sem afetar o estado de outro domínio no mesmo processo.
  • Uma falha ou exceção em um domínio não afetam um aplicativo em outro domínio.
  • Informações de configuração faz parte do escopo de um domínio, e não do escopo do processo.
  • Para cada domínio podem ser atribuído diferentes níveis de acesso de segurança.
  • O código em um domínio não pode acessar diretamente o código em outro.
  • Neste sentido, o CLR é como um mini sistema operacional. Roda um único processo que contém vários sub-processos, ou domínios de aplicativo.
  • A vantagem de domínios de aplicativo é que a execução de vários domínios de aplicativo requer menos recursos, como memória, do que a execução de processos de múltiplos sistemas operacionais.
Domínio de aplicativo também podem ser explicitamente criados por aplicativos .NET. Aqui abaixo está um exemplo em C# que cria um domínio de aplicativo (AppDomain), cria uma instância de um objeto dentro dele, e então executa um dos métodos do objeto. Note que você deve nomear o executável para ‘appdomaintest.exe ‘ para funcionar corretamente.
using System;
using System.Runtime.Remoting;
public class CAppDomainInfo : MarshalByRefObject
{
	public string GetAppDomainInfo()
	{
		return "AppDomain = " + AppDomain.CurrentDomain.FriendlyName;
	}
}

public class App
{
	public static int Main()
	{
		AppDomain ad = AppDomain.CreateDomain( "Andy's new domain", null, null );
		ObjectHandle oh = ad.CreateInstance( "appdomaintest", "CAppDomainInfo" );
		CAppDomainInfo adInfo = (CAppDomainInfo)(oh.Unwrap());
		string info = adInfo.GetAppDomainInfo();
		Console.WriteLine( "AppDomain info: " + info );
		return 0;
	}
}

LINQ To XML – Como Criar e Acessar XML com LINQ

Nesse exemplo vou mostrar como podemos acessar e criar XML usando o LINQ to XML
Criando o elemento XML:

            XElement Clientes = new XElement("Clientes",
                            new XElement("Cliente",
                            new XElement("ID", "1"),
                            new XElement("Nome", "Cliente1"),
                            new XElement("Endereco", "Rio de Janeiro")
                            ),
                            new XElement("Cliente",
                            new XElement("ID", "2"),
                            new XElement("Nome", "Cliente2"),
                            new XElement("Endereco", "São Paulo")
                            ),
                            new XElement("Cliente",
                            new XElement("ID", "3"),
                            new XElement("Nome", "Cliente3"),
                            new XElement("Endereco", "Santos")
                            )
                            );

Resultado:

<Clientes>
  <Cliente>
    <ID>1</ID>
    <Nome>Cliente1</Nome>
    <Endereco>Rio de Janeiro</Endereco>
  </Cliente>
  <Cliente>
    <ID>2</ID>
    <Nome>Cliente2</Nome>
    <Endereco>São Paulo</Endereco>
  </Cliente>
  <Cliente>
    <ID>3</ID>
    <Nome>Cliente3</Nome>
    <Endereco>Rio de Janeiro</Endereco>
  </Cliente>
</Clientes>

Vamos agora utilizar LINQ com a classe XDocument para selecionar todos os clientes residentes no Rio de Janeiro:

            XDocument doc = XDocument.Parse(Clientes.ToString());

            var ClientesRJ = from p in doc.Root.Elements("Cliente")
                              where p.Element("Endereco").Value == "Rio de Janeiro"
                              select p;

            foreach (var cliente in ClientesRJ)
                Console.WriteLine("{0} {1}", cliente.Element("Nome").Value, cliente.Element("Endereco").Value);

Resultado:
Cliente1 — Rio de Janeiro
Cliente3 — Rio de Janeiro

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

%d bloggers like this: