BAND | Projetos TI
v 1.0
update: 19/12/2010
Band – Projetos TI
Natanael Rodrigues
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
Preview
 Conceitos Básicos de Modelagem OO;
 Introdução a Domain-Driven Design (DDD)
 Aggregate Patterns
 Repository Patterns
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
OO – Conceitos Básicos
Referência ou
Associação Direta
Herança
Agregação
Composição
Interface
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
DDD - Princípios
Domain-Driven Design (DDD)
Coleção de princípios e padrões que ajuda o desenvolvedor a
construir objetos de sistemas mais elegantes, limpos e coesos.
Aplicado, adequadamente:
 Nos leva a abstração do software, com uso de modelos de
domínios (Domain Model);
 Ajudar a “reduzir” o “gap” (fosso) entre a realidade do negócio e
o código.
Proposta ou Orientação:
Camada Anti-Corrupção;
Contextos ou Domínios de Negócios
 Modelo mais simples e coeso;
Conceitos:
- Bounded Context X Domain Model X Module
- Shared Kernel
- Anti-Corruption Layer
Como fazer:
- Crie uma linguagem de comunicação com o cliente (Domain Expert);
- Identificar Contextos de Negócio (Domínios de Negócio).
- Crie sistema com responsabilidades individuais  Domain Business
Brainstorms
Experimentos
Testes
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
Principais Padrões (Patterns)
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
Entity / Aggregate Root
 Tem Identidade e uma vida;
 Se tem identity, via de regra são eleitas
como aggregate root.
 Guarda seus agregados com muito zelo;
(não deixa ninguém mexer)
(camada anti-corrupção)
 Evita o excesso de acoplamento dos
objetos que compõem o modelo,
impondo algumas regras simples:
- associações desnecessárias;
- otimização do ciclo de vida dos objetos;
-
 Expões referências internas a outros
domínios.
 Tem um identidade Global;
Aggregates
 Tem Identidade Local
 Reduz associações bidirecionais.
 Se não é essencial remove!
 Tem sempre um {root} do tipo entity.
 Outro objeto só acessa ele pelo root.
 Se root morre, aggregados morre junto.
Aggregate Pattern
Value Objects
 Não tem identidade
 Descreve as coisas que tem identidade
 São imutáveis;
(ex: endereço, money, etc...)
 São entidades que podem ser
compartilhadas.
Repository
 Responsável pelo CRUD das entidades;
 um repository por aggregate root;
 forte candidata a uma super classe;
Services
 Operações ou processos sem identidade
ou ciclo de vida no domínio;
 Criado sempre que a operação não é uma
natural ou direta responsabilidade da
“entity”, “aggregate” ou “Value Object”
(quando não tem um lugar natural no domímio, ou
precisa de uma conexão com outro domínio)
 Operações com 2 aggregates root;
 Não confundir com SOA;
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
Aggregate Pattern
Domain Model
Feature
Domain Model: Cliente
Domain: Pedido
Cadastrar
Produto
Realize
Domain: Produto
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
DDD - Assência
Domain Models: Coração do Software
Principal objetivo:
Combater a complexidade!
Blindagem
Anti-Corruption Layer
Fazer o “sangue” fluir pelos
“membros” do corpo por
vias naturais!
(facades, interfaces, túneis, layers..)
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
Aggregate Pattern
Domain Model
User Story:
Eu como fazendeiro... quero controlar produção de uvas.
Pegando somente uvas boas em cada caixo para então
armazená-los em caixas para venda ou transporte.
Tenho 6 fazendas... e 2 funcionários para cuidar de cada
parreira que deve produzir pelo menos 2 ton/ano.
Use Cases
- Controlar colheita e armazenagem de uvas
- Cadastrar fazendas
- Cadastrar Empregados
- Calcular Produção por Parreira
Discutir
Pensar
Experimentar
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
Repository Patterns
Reposotory
 responsável pelo CRUD das entidades;
 um repository por aggregate root;
 Qualquer acesso ou manipulação aos
dados é feito pelo repository.
 Eventualmente podemos ter um
aggregate com serviços, ou estes podem
estar no Repository.
 Serviços que manipulam 2 dominios deve
estar fora das entidades aggregates
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
Generics X RepositoryPatterns
Generics <T> e “EntityRepository”
Base para
Repository Patterns
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
Generics X Repository
Classe Base para Persistência
Uso da Classe Base em Classe de Domínio
namespace Shared.NHibernateDAL
{
namespace BusinessDomain
{
public class Produto: BaseEntityRepository<Produto>
{
public Produto()
public class BaseEntityRepository<T>
{
public virtual void Save()
{
{
ISession session = NHibernateSessionManager.Instance.GetSession();
if (!this.IsPersisted)
session.Save(this);
else
session.SaveOrUpdateCopy(this);
session.Flush();
}
public virtual void Delete()
{
ISession session = NHibernateSessionManager.Instance.GetSession();
session.Delete(this);
session.Flush();
}
this.Nome = null;
this.Peso = 0;
}
private string _nome;
private decimal _peso;
public virtual decimal Peso
{
get { return _peso; }
set { _peso= value; }
}
public static IList<Produto> GetByFabricante(Fabricante fornec)
{
ISession session = NHibernateSessionManager.Instance.GetSession();
IQuery query = session.CreateQuery("from Produto");
return (IList<Produto>)query.List<Produto>();
public static T GetByID(int id)
{
if (id <= 0)
return default(T);
else
{
ISession session =
NHibernateSessionManager.Instance.GetSession();
return session.Get<T>(id);
}
}
}
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
Nhibernate to RepositoryPattern
Mapeamentos NHibernate
Web.Config
HBM-XML
public class Cat {
private string id {get; set;} ;
private string name {get; set;} ;
public Cat()
... { . . . }
}
Mapping Attributes
[NHibernate.Mapping.Attributes.Class]
public class Customer
{
[NHibernate.Mapping.Attributes.Property]
public string FirstName { ... }
...
}
Mapeamento de Stored Procedure
 Performance;
 Fragmentação domínio de negócio;
Domínio deve executar os serviços e manter as entidades;
Cat.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2“
namespace="QuickStart" assembly="QuickStart">
<class name="Cat" table="Cat">
<!-- A 32 hex character is our surrogate key. It's automatically
generated by NHibernate with the UUID pattern. -->
<id name="Id">
<column name="CatId" sql-type="char(32)" not-null="true"/>
<generator class="uuid.hex" />
</id>
<!-- A cat has to have a name, but it shouldn' be too long. -->
<property name="Name">
<column name="Name" length="16" not-null="true" />
</property>
<property name="Sex" />
</class>
</hibernate-mapping>
Vantagens:
 Manter: Plain Old CLR Object (POCO)
 Completo ORM / Mapper:
Herança, Agregação e Composição
 Interdependência de Infra/Banco - IOC
 Ganhos tecnológicos como LazyLoad e outros;
http://nhforge.org
http://fluentnhibernate.org
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
Visão Geral / Infra
Domain Model
Repository
ORM
Mapper
SQL
Service
Data
File
“MDF”
Repository
ORM
Mapper
SQL
Service
Data
File
“MDF”
Pedido
Pedido
ItemPedido
Produto
© 2010 – BAND | Projetos TI
Natanael R. Silva
BAND | Projetos TI
© 2010 – BAND | Projetos TI
Natanael R. Silva
Download

WorkShop(DDD)(v2)