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/
Felipe Augusto é MCP (Programming in C# Specialist), atua com desenvolvimento WEB e Desktop.
Conhece produtos Microsoft (Dynamics CRM e Sharepoint) a ponto de atrever-se a personalizá-los, é entusiasta do Windows Phone, fã de HQs, Bill Gates e Palmeirense fanático.
Apaixonado por criação de software, acredita que procedures com regras de negócio podem ser o início de um crime.
Conhece produtos Microsoft (Dynamics CRM e Sharepoint) a ponto de atrever-se a personalizá-los, é entusiasta do Windows Phone, fã de HQs, Bill Gates e Palmeirense fanático.
Apaixonado por criação de software, acredita que procedures com regras de negócio podem ser o início de um crime.
Diário .Net
quarta-feira, 23 de abril de 2014
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
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!
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.
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
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.
=]
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
Assinar:
Postagens (Atom)