fluent nhibernate - baby steps
TRANSCRIPT
ORM Nhibernate
Fluent NHibernate.Net C#
André Rocha Agostinho
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.
O problema
• Linguagens OO - Orientado à Objetos - Tipos não escalares• Linguagem SQL – Linguagem Estruturada - Tipos escalares
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”}
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”});
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]);
A solução
• Persistências dos objetos
Repository.People.Save(people);Repository.PhoneNumber.Save(people.phoneNumber);
TblPeople
People
TblPhoneNumber
PhoneNumber
ORM
DBMS
OO APPInsert 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
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.
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); }}
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
Baby Steps in C#Instale o projeto usando o Nuget• PM> Install-Package FluentNHibernate
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
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”
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
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>”
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
Referências
• http://www.fluentnhibernate.org/• http://hibernate.org/• http://nhibernate.info/• http://www.fluentnhibernate.org/• https://github.com/aragostinho/FluentGenericDao