Git Product home page Git Product logo

supremo-ddd-patterns's Introduction

Aplication to learn and pratice ddd-pattern and Clean Architecture(design of code)

Local development

  • Do not required node/npm on host. Installs node_modules in the container image so local development don't problem of bind-mounting witch local source code. Add local host node_modules for not a problem with IDEs
  • Edit source code in host while run in container. The docker-compose.yaml uses bind-mount of host source code into container

Started

To build custom local image:

  • Runing docker compose build
  • If changing package.json you need to rebuild custom local image or run docker compose up --build

To run the project:

  • Execute docker compose up -d

To execute the unit-tests:

  • Execute docker compose exec supremo_ddd_app npm test, It will:
  • Run a process npm test in the container.

To connect into de container:

  • Run docker exec -it supremo_ddd_patterns bash
  • If it is inside container run npm test

To down container:

  • Execute docker compose down

Domain Events

  • "Use um evento de domínio para capturar uma ocorrência de algo que aconteceu no domínio" Vernon, Vaughn. Implementing DDD

  • "A essência de um evento de domíno é que você o usa para capturar coisas que podem desencadear uma mudança no estado do aplicativo que você está desenvolvendo..." Fowler, Martin. Domain Event

  • Todo envento deve ser representado em uma ação realizada no passado. UserCreated, OrderCreated, OrderPlaced, OrderPaid, OrderInvoiced, OrderDelivered

Quando utilizar

Normalmento utilizamos quando queremos notificar outros Bounded Context de uma mudança de estado.

Componentes

  • Event: Tem data e hora e o que aconteuceu
  • Handler: Executa o processamento quando um evento é chamado(posso ter varios handles para um evento, Ex: evento Cria usuário handler Enviar email, handler Cadastra no CRM, handler Envia para mensageria)
  • Event Dispatcher: Responsável por armazenar e executar os handlers de um evento quando ele for disparado(registro todos os eventos e quais os handles do evento e posso notificar e os handles quando evento é disparado)

Dinâmica

  • Criar um Event Dispatcher
  • criar um Evento
  • criar um Handler para Evento
  • Registrar o Evento, juntamente com o Handler no Event Disátcher
  • Disparanto um evento, é só executar o método notify/dispatcher/send do Event Dispatcher e todos os Handlers registrado no evento serão executados

Modulos em contexto DDD - Como modularizar minha APP?

  • Serve como container nomeados para classes e objetos de domínio
  • Nomear adequadamente, pois modulos não são compartimentos de armazenamento anêmicos ou genéricos
  • Respeitar a liguagem Universal(ubíquo) - modulos devem gritar o que está fazendo/o que é, ou seja modulo não representa o nome do projeto, empresa, marca
  • Um ou mais agregados devem estar juntos se fazem sentido
  • Organizar pelo domínio/subdomínio(contexto) e não pelo tipo de objetos(ou camada)
  • Devem respeitar a mesma divisão quando estão em camadas diferentes
  • Pense em contexto delimitado(bounded context) dentro dele os modulos(pacotes), então varios modulos(pacotes) podem compor um único contexto delimitado

Fabricas(Factories)

"Desloque a responsabilidade de criar instâncias de objetos complexos e AGREGADOS para um objeto separado, que pode não ter responsabilidade no modelo de domínio, mas ainda faz parte do desing do domínio. Forneça uma interface que encapsule toda a criação complexa e que não exija que o cliente faça referência às classes concretas dos objetos que estão sendo instanciados. Crie AGGREGATES inteiros de única vez, reforçando suas invariantes" Evans, Eric. DDD(p. 138). Person Educação. Kindle

  • Não conheço a implementação da criação, apenas os dados de entrada
  • Podemos ter dois patterns: Factory metod ou Abstract factory
Client -- new(parameters) --|> FACTORY -- create --|> product <-- product--o

supremo-ddd-patterns's People

Contributors

fmchagas avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.