Fujiy

Blog sobre .NET, C#, ASP.NET entre outras tecnologias de desenvolvimento de software

RavenDB - Introdução

28/02/2012 23:30:16 Por Fujiy

Nos últimos anos tem se falado muito sobre NoSQL, sobre os ganhos em performance, escalabilidade, simplicidade, etc. Ele não veio para substituir os bancos relacionais, mas é mais uma alternativa a se considerar. Na verdade usamos bancos relacionais como bala de prata, simplesmente porque eles estão lá, é praticamente uma regra, mas nem sempre são a melhor opção. Como disse Abraham Maslow, "Para quem só sabe usar martelo, todo problema é um prego."

O RavenDB é especial para desenvolvedores .NET pois é feito em .NET e Open Source. O que não quer dizer que ele é de graça, caso você queira usar em algum produto comercial você precisa comprar uma licença, mas não se preocupe pois é muito barata em comparação aos bancos relacionais e o ganho em produtividade paga o custo rapidamente.

Além disso, como é destacado no logo, ele é um banco de dados orientado a documentos de 2ª geração. Entre suas vantagens podemos destacar:

  • ACID
  • Sem Locking
  • Seguro
  • API amigável
  • LINQ
  • Compatível com DDD(Aggregates)
  • Multi-Level cache
  • Escalável
  • Schema Free
  • Sharding
  • Replication
  • Full Text Seach (contruido com Lucene)
  • Entre muitos outros...

Neste post introdutório quero apenas mostrar (enquanto aprendo) como fazer um projeto bem simples, apenas gravando e lendo um documento no banco.

Criei um website vazio pra usar como teste e pelo NuGet você pode instalar o RavenDB-Embedded, que roda junto com o site em vez de instalar um serviço.

O primeiro passo é criar uma instância Singleton do DocumentStore, isso pode ser feto facilmente com uma variavel static readonly, ou como no meu caso eu uso o Global.asax, no Application_Start crio uma instancia que é usada até o site ser reciclado ou parado:

    private static IDocumentStore DocumentStore { getset; }
    void Application_Start(object sender, EventArgs e)
    {
        DocumentStore = new EmbeddableDocumentStore
        {
            DataDirectory = "Data",
            UseEmbeddedHttpServer = true
        }.Initialize();
    }

O DocumentStore será usado pra criar um IDocumentSession quando acessarmos o banco de dados. O IDocumentSession representa um Unit Of Work. Para facilitar criamos uma Sessão no inicio de cada Request no Global.asax e colocamos no dicionário Items do Request. A melhor forma de fazer isso depende da sua aplicação, você poderia usar um IoC, ou criar a Sessão toda vez que quiser usar o banco, é mais ou menos como fazemos com o DbContext ou ObjectContext do Entity Framework.

    void Application_BeginRequest(object sender, EventArgs e)
    {
        HttpContext.Current.Items["CurrentRequestRavenSession"] = DocumentStore.OpenSession();
    }

A API básica é bastante simples e é algo que o Ayende valoriza muito, para ter uma idéia são apenas 6 métodos.
Para gravar um novo objeto não poderia ser mais simples, apenas duas linhas:

Livro novoLivro = new Livro
                        {
                            Nome = TxtNome.Text,
                            Preco = decimal.Parse(TxtPreco.Text),
                            Autores = TxtAutores.Text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
                        };
RavenSession.Store(novoLivro);
RavenSession.SaveChanges();

Com a mesma facilidade podemos fazer as outras operações, como consultar um documento pelo Id:

Livro livroEditado = RavenSession.Load<Livro>("livros/" + HidId.Value);

Atualizar:

Livro livroEditado = RavenSession.Load<Livro>("livros/" + HidId.Value);
livroEditado.Nome = TxtNome.Text;
livroEditado.Preco = 
decimal.Parse(TxtPreco.Text);
livroEditado.Autores = TxtAutores.Text.Split(
new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
RavenSession.SaveChanges();

Apagar um documento:

Livro livroApagado = RavenSession.Load<Livro>("livros/" + id);
RavenSession.Delete(livroApagado);
RavenSession.SaveChanges();

E uma Query simples:

GrvTodos.DataSource = RavenSession.Query<Livro>();

Isso é o básico, o RavenDB tem muitos recursos avançados que pretendo falar nos próximos posts, a medida que vou me familiarizando com este excelente Document DB.

Caso queira testar, estou disponibilizando o código que usei. Para se ter uma idéia, a maior parte do código é pra controlar os Controles do Form do que o banco de dados em si.

RavenDbIntroducao.zip

Stack Exchange Open Source Projects

22/02/2012 21:40:53 Por Fujiy

O Stack Overflow, assim como toda a rede, chamada de Stack Exchange, é com certeza um dos melhores se não for o melhor site para se usar como exemplo de aplicação bem feita em .NET. Sempre falo do Stack Overflow e tenho muita admiração, pra começar porque foi feito por desenvolvedores .NET renomados. O site é muito rápido e a interface com o usuário é excelente, da até tristeza quando procuro algo no Google e nos primeiros resultados vem algum tópico no fórum MSDN, é tão lento que da tempo de repetir a busca no Google filtrando somente o Stack Overflow e abrir a página antes do MSDN abrir.

Tudo feito no Stack Overflow é planejado pra ser TOP. Se vão mudar uma placa de rede, pesquisam e fazem testes com os firmwares pra conseguir o máximo de desempenho. Todas os requests e queries são monitorados, até o trabalho do Garbage Collector chega a ser otimizado.

Recentemente o Jeff Atwood postou no blog do Stack Overflow sobre os projetos Open Source que eles mantém. São bem interessantes, já planejo usar o MiniProfiler 2.0 no FujiyBlog.

Leia mais...

Limit your abstractions - Série sobre abstrações e seus custos

22/02/2012 20:32:27 Por Fujiy

O blog do Ayende é um dos que considero leitura obrigatória pra qualquer desenvolvedor, ainda mais .NET. Ele já me salvou de usar abstrações inúteis uma vez e nesta série ele volta a falar sobre abstrações que mais atrapalham do que ajudam, adicionando complexidade e "cerimônia" que não ajudam em nada.

Ele fala um pouco sobre como ele costuma programar e o design usado. As aplicações que ele desenvolve costumam ter 7 abstrações:

  1. Controllers
  2. Views
  3. Entities
  4. Commands
  5. Tasks
  6. Events
  7. Queries

Os três primeiros são bastante conhecidos, Commands são como um pacote, que acontece assim que é chamado, as Tasks por sua vez não tem um momento exato para ocorrerem, como uma tarefa assíncrona. Events são usados quando algo importante acontece no sistema e requer uma ação. E as Queries também são obvias.

A série até agora já tem 13 partes:

Limit your abstractions: Analyzing a DDD application
Limit your abstractions: Application Events–the wrong way
Limit your abstractions: Application Events–what about change?
Limit your abstractions: Application Events–Proposed Solution #1
Limit your abstractions: Application Events–Proposed Solution #2–Cohesion
Limit your abstractions: Application Events–event processing and RX
Limit your abstractions: You only get six to a dozen in the entire app
Limit your abstractions: Commands vs. Tasks, did you forget the workflow?
Limit your abstractions: All cookies looks the same to the cookie cutter
Limit your abstractions: So what is the whole big deal about?
Limit your abstractions: Refactoring toward reduced abstractions
Limit your abstractions: The key is in the infrastructure…
Limit your abstractions: And how do you handle testing?

Código Limpo (Clean Code) por Robert C. Martin ou "Uncle Bob"

22/02/2012 19:57:20 Por Fujiy

Eu estava com um cupom do Submarino de R$50,00 e essa promoção foi perfeita. Tudo bem que eu preferiria se tivesse a versão original em inglês, pois as traduções de livros técnicos costumam ser bem ruins.

Tenho que acelerar a leitura, ultimamente os livros estão acumulando....estou terminando o Entity Framework e já tem na fila Microsoft® SQL Server® 2008 Internals e o Code Complete, também em português...

O autor do livro, Robert C. Martin, mais conhecido como Uncle Bob, é o autor dos livros que são referência em Extreme Programming e desenvolvimento ágil de software.

Edit: Dica do Kim, na Saraiva está R$67,00 a versão em inglês

FujiyBlog - ReCaptcha

14/02/2012 22:26:36 Por Fujiy

Esta noite terminei de aplicar o ReCaptcha ao FujiyBlog, esta funcionalidade também virá na v0.3.

Já ativei aqui no blog, agora pra comentar precisa digitar o captcha correto.

FujiyBlog executando em Medium Trust

13/02/2012 23:48:02 Por Fujiy

Na última semana trabalhei para remover a dependencia do AutoMapper que só executa em Full Trust por causa do Reflection. Também tive que descobrir por que o Entity Framework 4.3 estava exigindo Full Trust sendo que os developers garantem que não precisa. O problema era uma propriedade string non public que eu usava como back store pra um IEnumerable. Faz todo sentido, se a propriedade não é pública o EF é obrigado a acessar por Reflection, gerando o Security Exception.

Pretendo dar mais um polimento, atualizar todos os packages e só então liberar a versão 0.3. Entre as prioridades está as notificações de comentários por e-mail e o anti-spam para comentários.

Building Async Coordination Primitives

13/02/2012 23:37:48 Por Fujiy

Ontem o Stephen Toub("o cara" quando se fala sobre async) postou no blog Parallel Programming with .NET uma série de posts sobre como criar classes equivalestes aos "coordination primitives" mas Async. Ele usa como exemplo o ManualResetEvent, AutoResetEvent, entre outros, vale a pena conferir:

MonoTouch 5.2

10/02/2012 07:32:19 Por Fujiy

Recebi a newsletter da Xamarim informando que o Monotouch 5.2 está disponível, com mais de 300 novidades. Os destaques são:

Firefox 11 Beta faz Inspect 3D usando ferramenta Tilt

07/02/2012 22:01:35 Por Fujiy

A versão beta do Firefox 11 está disponível e traz uma ferramente no mínimo curiosa, o Tilt, que antes era uma extensão, permite inspecionar os elementos em 3D para ter uma noção melhor sobre as camadas:

Além disso também sincroniza extensões, suporta API de bateria, HTML Parsing e traz o suporte ao SPDY, que promete melhorar a velocidade e tempo de resposta das chamadas HTTP e HTTPS.

Sugestão que enviei pro Entity Framework foi aceita

02/02/2012 09:18:13 Por Fujiy

A Microsoft abriu uma série de forums no UserVoice para receber novas idéias sobre seus produtos, como Entity Framework, ASP.NET, WCF, etc. Os developers podem enviar novas idéias e votar, cada um tem direito à 10 votos.

Enviei uma sugestão pedindo que os Assemblies do Entity Framework sejam independentes do .NET Framework. Nos blogs os developers do EF já tinham comentado que vão tentar remover cada vez mais o Core do EF de dentro do .NET e agora vi a confirmação no UserVoice que minha sugestão está sobre revisão.

Segundo os ultimos posts no blog ADO.NET, no .NET 4.5 já poderemos ver uma evolução nesse sentido, mas como o 4.5 é uma atualização in-place, eles não tem tanta liberdade, nem podem remover classes.

Atualização: O Diego Vega acabou de passar a sugestão de "Under Review" pra "Planned"

  • Próximos posts
  • 1
  • Posts Anteriores