Fluent NHibernate - Baby Steps

333 visualizações

Publicada em

Fluent NHibernate - Baby Steps

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
333
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
6
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Fluent NHibernate - Baby Steps

  1. 1. ORM Nhibernate Fluent NHibernate .Net C# André Rocha Agostinho
  2. 2. Definição de ORM • Object Relational Mapping framework, which (as ORM states) maps between relational data and objects • Technique for converting data between incompatible type systems in object-oriented programming languages.
  3. 3. O problema • Linguagens OO - Orientado à Objetos - Tipos não escalares • Linguagem SQL – Linguagem Estruturada - Tipos escalares
  4. 4. O problema • Tipo escalar: Armazena um único tipo de valor associado a um símbolo. Exemplo: int peopleId = 1; string peopleName = “Carlos”; string phoneNumber = “011 3044-4292” Mesmo que usado uma array geralmente essa array seria tipada: string[] people = {“Carlos”, “Maria”}
  5. 5. O problema • Tipo nao escalar: Armazena mais de um tipo de valor associado a um simbolo. Exemplo: People people= new People(); people.id = 1; people.name = “Carlos”; people.phones = new List<PhoneNumber>().add(new PhoneNumber(){number=“011-30444292”});
  6. 6. O problema • String SQL Linguagem estruturada: int peopleId = 1; string peopleName = “Carlos”; string phoneNumber = “011 3044-4292” Repository.People.Save(peopleId,peopleName); Insert Into People(id,name) Values(@peopleId, @peopleName); Repository.PhoneNumber.Save(peopleId,phoneNumber); Insert Into PhoneNumber(peopleId,number) Values(@peopleId, @phoneNumber); Linguagem OO: People people= new People(); people.id = 1; people.name = “Carlos”; people.phones = new List<PhoneNumber>() .add(new PhoneNumber (“011-30444292”); Repository.People.Save(people); Insert Into People(id,name) Values(@people.Id, @people.name); Repository.PhoneNumber.Save(people); Insert Into PhoneNumber(peopleId,number) Values(@people.id, @people.phones[0]);
  7. 7. A solução • Persistências dos objetos Repository.People.Save(people); Repository.PhoneNumber.Save(people.phoneNumber); TblPeople People TblPhoneNumber PhoneNumber ORM DBMS OO APP Insert Into People(id,name) Values(@people.Id, @people.name); Insert Into PhoneNumber(peopleId,number) Values(@people.id, @people.phones[0]); HQL SQL insert into PhoneNumber (peopleId, number) select p.id, @people.phoneNumber[0] from Pessoa p where p.id = @people.id
  8. 8. Hibernate, Nhibernate e Fluent NHibernate • Hibernate ORM enables developers to more easily write applications whose data outlives the application process. As an Object/Relational Mapping (ORM) framework, Hibernate is concerned with data persistence as it applies to relational databases (via JDBC). • NHibernate is a mature, open source object-relational mapper for the .NET framework. It's actively developed, fully featured and used in thousands of successful projects. • Fluent NHibernate offers an alternative to NHibernate's standard XML mapping files. Rather than writing XML documents (.hbm.xml files), Fluent NHibernate lets you write mappings in strongly typed C# code. This allows for easy refactoring, improved readability and more concise code.
  9. 9. Nhibernate X Fluent NHibernate <?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace=“AddressBook" assembly=" AddressBook"> <class name=“People" table=“People"> <id name="Id"> <generator class="identity" /> </id> <property name="Name"> <column name="Name" length="16" not-null="true" /> </property> <bag name=“PhoneNumberList"> <key column=“peopleId" /> <one-to-many class=“PhoneNumber" /> </bag> </class> </hibernate-mapping> public class PeopleMap : ClassMap<People> { public PeopleMap() { Id(x => x.Id); Map(x => x.Name) .Length(16) .Not.Nullable(); HasMany(x => x.PhoneNumber); } }
  10. 10. Baby Steps in C# Criação de um projeto simples - Utilize os padrões de projeto que melhor atenda a sua necessidade] - Uma console application pode facilitar o seu estudo Console App Source from: https://github.com/aragostinho/FluentGenericDao
  11. 11. Baby Steps in C# Instale o projeto usando o Nuget • PM> Install-Package FluentNHibernate
  12. 12. Baby Steps com C# Crie e mapeie suas entidades • Crie uma camada para que possa armazenar suas entidades e mapeamentos • Comece com ao menos uma entidade simples. Isso irá facilitar para que possa testar toda a configuração Entidade “Task” Mapeamento “TaskMasp” Camada Domain
  13. 13. Baby Steps in C# Implemente a classe SessionFactory do NHibernate • Crie uma camada para que possa armazenar classes relevantes ao seu repositório de dados • Existem N formas de implementar a SessionFactory, cada implementação especifica para cada tipo de bando de dados. Camada Repository Exemplo de classe estática “FluentHibernateHelper”
  14. 14. Baby Steps in C# Implemente a classe SessionFactory com MySql • No exemplo usamos o banco de dados MySql. Instale o MySql Data PM> Install-Package MySql.Data Camada Repository
  15. 15. Baby Steps in C# Implemente uma camada Business (recomendado) • Como boa prática é recomendado que se crie uma camada para armazenar suas classes negócios as quais farão comunicação entre o seu repositório e as entidades do seu domínio. • Utilize os padrões de projeto que melhor se adequam ao seu projeto: Factory, Singleton, Generics.... • O Fluent já fornece métodos CRUD, mas como boa prática é recomendado que você cria uma interface DAO e uma classe abstrata para que possa “enriquecer” suas classes de negócios através de herança e reescrita de métodos. Camada Business Exemplo de classe abstrata “AbstractGenericDao<T>”
  16. 16. Baby Steps in C# Utilizando classes de negócios na sua aplicação • Como resultado final a utilização de sua classes de negócios na sua aplicação deve proporcionar facilidade para codificação e chamada dos métodos CRUD e ser 100% independente das informações de seu repositório. Console App
  17. 17. Referências • http://www.fluentnhibernate.org/ • http://hibernate.org/ • http://nhibernate.info/ • http://www.fluentnhibernate.org/ • https://github.com/aragostinho/FluentGenericDao

×