quarta-feira, 23 de abril de 2014

Repositório genérico com Entity Framework.

Acabo de postar no codeplex  o meu projeto que é um repositório genérico utilizando Entity Framework. 
Neste momento você deve estar pensando que há milhares de exemplos na internet sobre repositórios genéricos mas garanto que não são muitos que propõe essa separação que este projeto propõe.

Primeiro que ele não te obriga a implementar uma interface com um campo Id para poder fazer o famoso GetById.

O projeto fica em uma camada externa garantindo a separação de responsabilidade e não precisa referenciar nada no projeto, simplesmente basta consumi-lo em sua aplicação informar o contexto e a classe POCO na qual ele irá trabalhar.

Contém todas as funções principais de Insert, Update, Delete, Retrieve com ou sem filtros, possibilidade de incluir entidades relacionadas e inicialmente um método assíncrono em fase experimental no qual retorna todos os dados da tabela.


*Importante - O projeto somente atende a Code First com ou sem Reverse Enginner.


Inicialmente para usar em suas classes clientes tudo que precisa ser feito é:


RepositoryFactory<Estado> estado= new RepositoryFactory<Estado>();

Repository<Estado> rep = estado.CriarRepositorio(new MinhaClasseContext());

var todos = rep.GetAll("Cidades");

https://genericrepositoryef.codeplex.com/

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

segunda-feira, 27 de janeiro de 2014

Reformulação do blog

Olá,

O blog foi reformulado e agora está de cara nova, espero que com o visual mais "clean" agrade aos visitantes e frequentadores.

=]

quinta-feira, 9 de janeiro de 2014

Trabalhando com Entity Framework Code-First em uma biblioteca de classes (Class Library)

Olá, provavelmente muitos de nós desenvolvedores em algum momento começamos a querer separar as responsabilidades em nossos projetos , mas em vista da dificuldade de retirar o modelo Code-First da pasta Model nativa do projeto MVC, alguns desenvolvedores optam por deixar assim mesmo e não ter dor de cabeça com os dataAnnotations, porém para a separação ser feita é muito simples, siga as etapas abaixo:

Crie uma  class Library em sua solution, e referêncie a dll do Entity Framework em seu projeto e também System.ComponentModel.DataAnnotations;.

Após ter feito isso vamos criar a classe Produto.cs

public partial class Produto
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

   [MetadataTypeAttribute(typeof(Produto.Metadata))]
   public partial class Produto
   {
       internal sealed class Metadata
       {
           private Metadata() { } // classes de Metadata não devem ser instanciadas

           // Adicione os metadados de validação
           [Required]
           [StringLength(60)]
           public string Name;
       }
   }

Note que criamos a classe como partial, com um simples conhecimento de programação orientada a objetos sabemos como funciona uma classe partial não é mesmo?
Obs: Só separamos para não sujarmos a primeira partial do Produto com os Annotations,  e setar tudo que for metadado na outra partial, mas isso fica a critério de vocês, optei por esta forma.



Vamos agora ao nosso Context
public class Context : DbContext
    {
        public DbSet<Produto> Produto { get; set; }
    }

Nesta parte não há nada de diferente então é só executar e ver o resultado:


É isso =]


domingo, 22 de dezembro de 2013

Compreendendo Assemblies no .NET Framework

Assemblies: São uma coleção de tipos e recursos que formam uma unidade lógica de funcionalidade, todos os tipos no .Net Framework precisam existir em um Assembly, o CLR (Common Language runtime) não suporta tipos fora de um Assembly, toda vez que construímos um projeto, seja ele Class Library, Windows Service, ou qualquer outra aplicação com o .Net Framework estamos construindo um assembly. Cada assembly é armazenado em um .exe ou em uma .dll.

O .Net framework usa os assemblies como unidade fundamental para diversos fins:

·         Segurança
·         Type Identity
·         Escopo de Referencia (Reference Scope)
·         Versionamento
·         Deployment

Segurança:
Os assemblies são a unidade que contém as permissões de segurança, e elas são requisitadas e concedidas, são também o nível que você estabelece a identidade e confiabilidade.
O .NET Framework habilita dois mecanismos para este nível de segurança do Assembly:
Strong Names e Signcode.exe.
Strong Names: Ao assinar um Assembly com Strong Name é adicionado uma chave pública (public key) de encriptação para o assembly. Isto assegura que o nome de seu assembly será único e previne a substituição por qualquer outro assembly com o mesmo nome.
                Signcode.exe:  Permite incorporar um certificado digital ao assembly.  Isto permite aos usuários do mesmo verificar a identidade do assembly.

Type Identity:
A identidade de um assembly depende do assembly onde foi definido, isto é, se você define um tipo chamado DataStore em um assembly, e um tipo chamado DataStore em outro assembly, o .NET Framework poderá trabalhar com ambos, pois eles estão em locais diferentes, em outras palavras, você não pode definir dois tipos diferentes com o mesmo nome no mesmo assembly.

Escopo de Referencia (Reference Scope):
O Assembly também é o local de referências de informações gerais, cada assembly contém informações de referência das seguintes formas:
·         O assembly contém Metadata que especifica os tipos e recursos dentro do assembly que são expostos aos códigos de fora. Por exemplo um assembly pode expor um tipo público chamado Customer com uma propriedade pública chamada AccountBalance.
·         O assembly contém em seu Metadata a especificação de outros assemblies no qual depende. Por exemplo, um assembly pode especificar que depende do System.Windows.Forms.dll

Versioning:
Cada assembly tem um número de versão 128 bits que é representado em 4 partes decimais na forma de Major.Minor.Build.Revision
Exemplo: 3.5.0.126
Isto serve para que seja evitado o antigo DLL HELL, pois sempre que os desenvolvedores realizavam um update na dll muitos problemas ocorriam, afinal gerava incompatibilidade das versões e muita coisa parava de funcionar dando muita dor de cabeça.
Com o versionamento do assembly cada programa aponta para a versão testada do assembly e podem viver em harmonia com outras versões do assembly, pois ele irá utilizar a versão testada e compatível deixando assim os desenvolvedores livres para gerar novas versões.
Os upgrades de uma aplicação travavam outras, com o versionamento isto acabou, um programa pode usar a versão “Y” do assembly e outros programas a versão “X”.

Deployment:
Os assemblyes são uma unidade natural do deployment, você pode fazer deploy de seus assemblies de diversas formas incluindo um simples xCopy ou download via website.
Quando você inicia sua aplicação, ela carrega outros assemblies e recursos que o seu assembliy necessita.

Assembly Manifest
Por último mas não menos importante o assembly manifest, este cara contém os metadados com informações sobre seu assembly, ele contém os seguintes items:

·         O nome do assembly e a versão
·         A cultura ou linguagem que o assembly suporta (não é obrigatório)
·         A chave pública (public key) para qualquer strong name assinado no assembly (não é obrigatório)
·         Informações de assemblies referenciados
·         Uma lista de arquivos no assembliy com informações em uma lista de hash

·         Informações de tipos exportados