Utilizando Entity Framework no desenvolvimento de aplicações, temos a vantagem de trabalhar de forma independeente com qualquer banco de dados, desde que haja um "provider" específico para Entity Framework.
Neste post, mostro que é possível utilizar EF com o banco de dados Oracle. Existem diversos providers de Oracle para o EF, um bom exemplo é o da DevArt (dotConnect), porém é uma solução paga. A própria Oracle está desenvolvendo um provedor com suporte ao Entity Framework, porém até o momento deste POST ainda se encontra na versão Beta 3, porém em breve teremos a versão de produção, aí então é só atualizar.
Pré-requisitos:
* ORACLE 10G express edition previamente instalado
http://www.oracle.com/technetwork/database/express-edition/database10gxe-459378.html
* ODAC1120250Beta_EntityFramework_32bit_xcopy
http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html
* EntityFramework Code First 4.1
http://www.microsoft.com/download/en/details.aspx?id=26825
Mãos à massa!
Crie um novo usuário no Oracle, para este post criei um usuário chamado REPOSITORIO. O banco de dados para este exemplo consite em uma tabela de PESSOAS, que possui zero ou mais telefones, relacionada com uma tabela de TELEONES A estrutura do banco de dados ficou assim:
Crie uma nova aplicação Console e adicione as seguintes referencias:
* EntityFramework.dll
* Oracle.DataAccess.dll (na pasta de instalação do Client do Oracle)
Veja o código completo da aplicação Console (coloquei todas as classes no mesmo arquivo Program.cs para este post, obviamente costumo separar um arquivo para cada classe nos meus projetos) :
Não esquecer de corrigir a string de conexão com o valor correto (geralmente é o nome da estação local).
quinta-feira, 10 de novembro de 2011
segunda-feira, 7 de novembro de 2011
A plataforma .NET
Estava pensando aqui sobre a plataforma .NET. É uma plataforma para todos, completa, extensa, robusta, com uma IDE incrível (Visual Studio 2010), com versões express, a maioria do que vou relacionar abaixo são produtos free ou royalty-free, sendo que muitos são OpenSource!
Linguagens criadas para o .NET:
C#
Boo
F#
Visual Basic.NET
Nemerle
Linguagens portadas para .NET:
Programar em Java? IKVM
Programar em Ruby ? IronRuby
Programar em Python? IronPython
Programar p/ Android ? Monodroid
Programar p/ iOS ? Monotouch
Programar em delphi/pascal ? Oxygene
Programar em PHP ? Phalanger.net
Tipos de Aplicativos
Desenvolver para Web ? ASP.NET
Desenvolver para desktop ? WPF, Windows Forms
Desenvolver aplicações RIA? Silverlight
Desenvolver para Cloud ? Azure
Desenvolver WebServices? Windows Communication Foundation
Rodar tudo isso no Linux ? Mono
Existem muitas outras tecnologias envolvendo a plataforma .NET, conforme eu vá encontrando links interessantes vou alterando este post.
terça-feira, 1 de novembro de 2011
Customizando o Repositório - Parte II
Podemos adicionar novas funcionalidades a um determinado repositório e manter a testabilidade. Uma das maneiras de se fazer isso é com o auxílio de uma interface adicional:
Customizando o Repositório - Parte I
Existem alguns métodos que podem ser sobrescritos e customizados com "override" ao extender a classe base do Repositório. Aqui vai um exemplo:
Abaixo segue uns Unit Tests mostrando a utilização do padrão.
Abaixo segue uns Unit Tests mostrando a utilização do padrão.
Repository Pattern
Utilizando o padrão repositório, as telas e páginas da aplicação que fazem acessos a banco de dados passam a acessar classes intermediárias que atuam como repositórios de dados, tornando a aplicação independente de um banco de dados real. Dessa forma, há uma melhor separação de responsabilidades, onde as telas não possuem lógica de persistência, que passa a ser de responsabilidade do repositório. Isso facilita a troca de banco de dados (utilizar SQL Server, Oracle, MySQL, etc) e também os testes, uma vez que podemos criar repositórios “fake”, trabalhando com listas em memória, além de separar lógica de persistência da lógica de interface com o usuário.
Como foi implementado o repositório?
Após uma refatoração completa, a interface do repositório agora depende de uma interface IUnitOfWork:
Com essa interface criada, podemos criar agora a interface IRepositorio:
Uma classe de extensão para alguns métodos úteis aos repositórios que forem implementados:
Temos o repositório, agora falta a implementação da interface UnitOfWork. Para implementar esta interface, achei conveniente criar uma classe base:
Precisamos da classe Container para nos auxiliar nas implementações de UnitOfWork:
Em seguida todas as implementações para os diversos bancos de dados que desejarmos devem herdar desta classe base, implementando a interface. A seguir a implementação padrão que utiliza Entity Framework CodeFirst, onde no construtor passa-se o DbContext.
A seguir a implementação padrão que utiliza Entity Framework tradicional, onde no construtor passa-se o ObjectContext.
Solução
Download da solution Abaixo segue o código demonstrando como utilizar o Entity Framework 4.1 Code First com 2 tabelas (Pessoas e Enderecos), com relacionamento Many-to-Many, e abstraindo o EFramework com o padrão repositório da forma mais simples, sem injeção de dependência.
Mostre código!
Classe Pessoa
Classe Endereco
Classe de Mapeamento e Configuração do Entity Framework
Método de teste
Utilizando o padrão repositório, as telas e páginas da aplicação que fazem acessos a banco de dados passam a acessar classes intermediárias que atuam como repositórios de dados, tornando a aplicação independente de um banco de dados real. Dessa forma, há uma melhor separação de responsabilidades, onde as telas não possuem lógica de persistência, que passa a ser de responsabilidade do repositório. Isso facilita a troca de banco de dados (utilizar SQL Server, Oracle, MySQL, etc) e também os testes, uma vez que podemos criar repositórios “fake”, trabalhando com listas em memória, além de separar lógica de persistência da lógica de interface com o usuário.
Unit Of Work Pattern
Recentemente refatorei a minha versão
de repositório que utilizo em minhas aplicações para dar suporte ao padrão
UnitOfWork. Utilizando esse padrão, os repositórios passam a compartilhar entre
si um objeto que faz a coordenação das transações dos repositórios a ele
anexados em uma única operação Commit/Rollback. Ou seja, ao instanciar os repositórios
para uma determinada operação, devo instanciar antes um objeto que implementa
IUnitOfWork, e passá-lo na construção desses repositórios. Ao chamar o método Commit()
do UnitOfWork, todos os repositórios anexados serão persistidos.
Como foi implementado o repositório?
Após uma refatoração completa, a interface do repositório agora depende de uma interface IUnitOfWork:
Com essa interface criada, podemos criar agora a interface IRepositorio:
Uma classe de extensão para alguns métodos úteis aos repositórios que forem implementados:
Temos o repositório, agora falta a implementação da interface UnitOfWork. Para implementar esta interface, achei conveniente criar uma classe base:
Precisamos da classe Container para nos auxiliar nas implementações de UnitOfWork:
Em seguida todas as implementações para os diversos bancos de dados que desejarmos devem herdar desta classe base, implementando a interface. A seguir a implementação padrão que utiliza Entity Framework CodeFirst, onde no construtor passa-se o DbContext.
A seguir a implementação padrão que utiliza Entity Framework tradicional, onde no construtor passa-se o ObjectContext.
Solução
Download da solution Abaixo segue o código demonstrando como utilizar o Entity Framework 4.1 Code First com 2 tabelas (Pessoas e Enderecos), com relacionamento Many-to-Many, e abstraindo o EFramework com o padrão repositório da forma mais simples, sem injeção de dependência.
Mostre código!
Classe Pessoa
Classe Endereco
Classe de Mapeamento e Configuração do Entity Framework
Método de teste
Assinar:
Postagens (Atom)