segunda-feira, 31 de março de 2014

Caching no .NET Framework



Olá, 

Hoje irei falar sobre os recursos de Caching do .NET Framework, iniciarei com um pequeno FAQ. 

FELIPE, o que é CACHE?
R:
Segundo a Microsoft: “Cache permite que você armazene dados na memória para acesso rápido. “, isso significa que tudo o que você armazenar em Cache estará disponível para consulta em memória sem praticamente nenhum custo, ou seja caso tenha uma grande consulta em um banco de dados, você pode 
armazenar em cache para não precisar ir no banco de dados novamente, de modo que o acesso em memória é muito mais rápido e estará disponível para toda a aplicação.


 Entendi o que é Cache, mas por que Cache e não Session?
R: Essa dúvida é muito comum, mas a principal diferença entre Session e Cache é que a Session é de escopo do usuário, Cache é da aplicação, por exemplo informações de Login , nome, endereço, etc. São do escopo da Sessão, objetos comuns expostos para todos os usuários podem ser armazenados em Cache.
 
Só consigo usar Cache em aplicativos Web?
R: Outra dúvida comum, embora Cache inicialmente só funcionassem em aplicativos Web , dentro do Namespace System.Web, em virtude dos muitos usos dos desenvolvedores e interesse (e dificuldade) de migrar os recursos para outras plataformas (tais como Desktop) a Microsoft disponibilizou as classes para trabalhar com Cache dentro do Namespace com System.Runtime.Caching.
 
Agora vamos a parte prática, usando Cache em nossos aplicativos. Vamos criar um aplicativo Web para evidenciarmos as diferenças entre Cache e Session, tudo pode ser aproveitando os templates padrões pois nosso foco é somente o Caching!

Criei um método simples que recebe uma chave e um valor e seta no Cache.

Dica: Nosso objeto cache tem alguns métodos para adicionar valores,  alguns deles são:  Add(), AddOrGetExisting() e o Set().

Descrições:

Add() -> Retorna verdadeiro ou falso, caso o item não exista no cache ele adiciona e retorna true, caso exista retorna falso e não faz modificações no item existente.
AddOrGetExisting() -> Retorna um object, caso o item exista no cache ele retorna o item existente e não atualiza, caso não exista ele insere no cache.
Set() -> Caso o item exista no Cache ele é sobrescrito, não tem retorno.


public class HomeController : Controller
    {
        // ARRANGE 
        ObjectCache cache = MemoryCache.Default;
        public ActionResult Index()
        {
            //Verifica o numero de items que existe no cache
            if(cache.ToList().Count >0 )
            {
                bool hasCache = true;
            }

            //Verifica se a sessão User existe
            if(Session["User"] != null)
            {
                bool hasSessao = true;
            }

            //Definindo a sessão de usuário
            Session["User"] = "usuario";

            InsertOnCache("Objeto 1", 2000);
            InsertOnCache("Objeto 2", 1000);

            //Este item sobrescreverá o anterior pois tem o mesmo nome de chave
            InsertOnCache("Objeto 2", 5000);

            return View();
        }

       
        public void InsertOnCache(string key, int value)
        {          
            cache.Set(key, value, new CacheItemPolicy());        
                      

        }

 Agora vamos ver isso funcionando, pois não adianta ver esse monte de código comentado sem observar o que ocorre.

 Obs: ADICIONE A REFERENCIA DO SYSTEM.RUNTIME.CACHING
 
 1 - Mande executar o projeto e note que ao debugar as nossas condições retornam falso pois não temos cache e nem sessão ainda.     
 2 -    Avance o breakpoint até popular o cache e observe-o ser criado, também observe que a Sessão User tem o nome “usuário” atribuido .

 
 3 -    Ao final da execução vc irá cair na página default do Asp.NET, aperte ‘F5’ na página e observe esta imagem e compare com a primeira, veja que tanto a Session quanto o Cache estão preenchidos e atendem as nossas validações.


 4 -    O truque agora é abrir em outro navegador NÃO PAUSE O VISUAL STUDIO, abra outro navegador na pagina da sua aplicação e veja a mágica, a Session[“User”] está nula pois é uma nova sessão, mas o Cache vem preenchido pois trata-se do escopo de aplicação, deste modo está visível a todos que a utilizam.

O mais complicado de inicio para quem só trabalha com Session é entender a utilidade do Caching, mas como vimos é de extrema importância e podemos utilizar em vários aplicativos melhorando a experiência do usuário.

:) 

terça-feira, 11 de março de 2014

Visual Studio Online – Deletando um projeto via Interface


A algum tempo atrás era necessário deletar os projetos do Visual Studio Online somente por comandos feitos através  do “Developer Command Prompt”
Enquanto mexia no TFS por acaso encontrei a opção pela interface, ainda é meio escondido, mas pelo menos não precisamos mais de um comando para deletar um projeto.

Passo 1:

Clique na área de administração da conta

                Figura 1: Administração da conta


Passo 2:
Será aberto o painel de controle do seu TFS, em seguida clique em
 “View the collection administration page”

                Figura 2: Painel de controle


Passo 3 (Final)
Clique sob um projeto com o botão DIREITO do mouse e a opção de Delete estará ativa.


Irá abrir uma janela, confirme e pressione o botão Delete Project.



Pronto :)

Serialização circular no WCF

Notei que o WCF retornava um erro de timeout, quando colocava como DataMember uma entidade relacionada, encontrei este link muito útil que resolveu o problema.

http://www.israelaece.com/post/Serializacao-Circular-no-WCF.aspx