fluent nhibernate - baby steps

17
ORM Nhibernate Fluent NHibernate .Net C# André Rocha Agostinho

Upload: andre-rocha

Post on 04-Aug-2015

49 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Fluent NHibernate - Baby Steps

ORM Nhibernate

Fluent NHibernate.Net C#

André Rocha Agostinho

Page 2: Fluent NHibernate - Baby Steps

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.

Page 3: Fluent NHibernate - Baby Steps

O problema

• Linguagens OO - Orientado à Objetos - Tipos não escalares• Linguagem SQL – Linguagem Estruturada - Tipos escalares

Page 4: Fluent NHibernate - Baby Steps

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”}

Page 5: Fluent NHibernate - Baby Steps

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”});

Page 6: Fluent NHibernate - Baby Steps

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]);

Page 7: Fluent NHibernate - Baby Steps

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

Page 8: Fluent NHibernate - Baby Steps

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.

Page 9: Fluent NHibernate - Baby Steps

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); }}

Page 10: Fluent NHibernate - Baby Steps

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

Page 11: Fluent NHibernate - Baby Steps

Baby Steps in C#Instale o projeto usando o Nuget• PM> Install-Package FluentNHibernate

Page 12: Fluent NHibernate - Baby Steps

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

Page 13: Fluent NHibernate - Baby Steps

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”

Page 14: Fluent NHibernate - Baby Steps

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

Page 15: Fluent NHibernate - Baby Steps

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>”

Page 16: Fluent NHibernate - Baby Steps

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