Visual Studio 11, .NET 4.5, Windows 8, Entity Framework 5...
Hoje tivemos vários lançamento, é muita informação, vou disponibilizar apenas links principais:
Blog sobre .NET, C#, ASP.NET entre outras tecnologias de desenvolvimento de software
Hoje tivemos vários lançamento, é muita informação, vou disponibilizar apenas links principais:
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:
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 { get; set; }
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.
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.
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:
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?
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