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