Arquitetura
Estrutura Visando uma melhor modularização, o Demoiselle está dividido por funcionalidades. Isto significa que o framework não é monolítico, no qual todas as suas funcionalidades estão contidas em um único pacote. Aliás, esta estratégia não é a mais indicada, pois projetos com um propósito específico, que não necessitam de persistência ou interface Web, por exemplo, teriam dependências desnecessárias. Assim, o Demoiselle é separado em Core, Extensões e Componentes. O Core do Demoiselle contém aquelas funcionalidades comuns a todas as extensões e aplicações. O core é simples, leve e formado majoritariamente por interfaces e poucas implementações. O Core é a base do framework, sem ele, as extensões e a própria aplicação não funcionariam. As Extensões, como o próprio nome sugere, estendem o Core com funcionalidades extras e bem específicas a um domínio ou tecnologia. Neste contexto, caso sua aplicação necessite de persistência com JPA, o framework fornecerá facilidades para você, contudo, estas funcionalidades não estão no Core. Para este propósito existem as extensões como a demoiselle-jpa, por exemplo. Cabe destacar que as extensões não possuem vida própria, pois estão diretamente ligadas ao núcleo do framework, inclusive o ciclo de vida das extensões está totalmente acoplado ao do Core. Já os Componentes são artefatos separados e que, portanto, não são dependentes diretamente do Core. Aliás, os Componentes podem até mesmo existir sem referenciar o Core. Desta forma, o seu ciclo de vida é totalmente independente do Core e Extensões. Um componente não precisa, necessariamente, estender o comportamento do Core, mas permitir disponibilizar novas funcionalidades ao usuário. Um exemplo é o demoiselle-validation.
Pacote Internal As boas práticas de programação nos alertam para que nunca sejamos dependentes de implementações, mas sempre de interfaces ou, como alguns costumam dizer, depender de contratos. As interfaces existem para isto: definem um contrato, enquanto as implementações deste contrato ficam à parte, de preferência, distante do programador da aplicação. O mecanismo de injeção de dependência fortalece ainda mais esta idéia. Sua aplicação precisará apenas depender das interfaces que o Demoiselle provê. A implementação específica será injetada automaticamente pelo CDI. As classes do pacote internal nunca devem ser referenciadas pela sua aplicação! Qual o motivo de toda esta explicação? Os programadores mais curiosos irão encontrar classes do framework que estão inseridas no pacote internal. Cabe alertar que as classes aí contidas não devem ser usadas diretamente pela aplicação, caso contrário, você estará acoplando-a com a implementação interna do framework, que pode sofrer mudanças sem aviso prévio. A equipe do Demoiselle possui atenção especial quanto às suas interfaces (contratos) e não irá modificá-las sem antes tornar públicas as mudanças. Contudo, tudo que consta no pacote internal pode sofrer mudanças repentinas. Isto significa que sua aplicação pode deixar de funcionar de uma versão para outra caso você esteja usando diretamente classes internas.
Arquitetura das aplicações É importante reforçar que o Demoiselle não obriga nenhum tipo de arquitetura para as aplicações, que podem ser constituídas com quantas camadas forem necessárias. Contudo, é prudente não exagerar! Para quem não sabe por onde começar, sugerimos uma arquitetura e padrões largamente utilizados pelo mercado, de forma a facilitar a manutenção e para melhor modularização de seu projeto. Usualmente, as aplicações são constituídas com pelo menos três camadas, desta forma é comum separar as lógicas de apresentação, regras de negócio e persistência. O Demoiselle já fornece estereótipos que visam tornar esta separação mais clara, respectivamente: @ViewController, @BusinessController e @PersistenceController. Maiores detalhes sobre cada anotação desta serão dados no decorrer desta documentação. Cabe destacar que estamos falando de uma macro-visão arquitetural. Cada camada desta pode ser organizada internamente da melhor forma possível, ou conforme os padrões vigentes no mercado. Para uma aplicação Swing, por exemplo, o padrão de projeto Presentation Model é bastante indicado e pode ser adotado em aplicações nesta plataforma. Para aplicações Web, os frameworks especialistas geralmente aplicam o padrão MVC (Model/View/Controller).