Fujiy

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

SQL Server 2012 RTM Lançado!

06/03/2012 20:02:43 Por Fujiy

Entrei no site do SQL Server pra ver se tinha alguma novidade quanto ao Release Candidate, talvez um RC1, e me deparo com a versão final! Ainda nem saiu os press releases.

Quem quiser já pode baixar o SQL Server 2012 RTM Trial

Visual Studio 11, .NET 4.5, Windows 8, Entity Framework 5...

29/02/2012 22:11:25 Por Fujiy

Hoje tivemos vários lançamento, é muita informação, vou disponibilizar apenas links principais:

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?