Arquitetura das Aplicações

A arquitetura das aplicações nativas Elevation é complexa. Os tópicos seguintes descrevem essa arquitetura sob as suas perspetivas mais importantes e descrevem ainda a parte fundamental dos componentes runtime da plataforma que farão parte dessas aplicações.

Tecnologia

A arquitetura base de uma aplicação Elevation é client/server, thin client com um application server, o Web server que executa o Web site da aplicação. Esse Web site é alojado no Microsoft Azure.

Utilizam-se tecnologias Web de última geração como o Angular JS para controlar os componentes de cliente, que executam em qualquer browser e em qualquer dispositivo (porque a tecnologia de apresentação é HTML5).

As views da aplicação são ASP.NET MVC.

Existem duas camadas de serviços, uma interna, usada pela aplicação, própria da sua lógica de interação, e uma pública, via Web API para integração de sistemas externos.

A lógica de negócio principal é implementada pelos business managers.

A camada de dados é gerida pela Entity Framework com um reposítório SQL Azure.

Tecnologias Elevation

Modularidade

Uma aplicação Elevation é basicamente um Web site (o host) que agrega todas as suas funcionalidades numa “Shell”.

A aplicação é composta por um conjunto de módulos, uns disponibilizados pela plataforma, com funcionalidades transversais a todos os produtos, e outros de negócio. Um módulo pode fazer parte de várias aplicações (produtos).

Os módulos “falam” entre si através de uma API interna e disponibilizam uma API externa (a Web API) para que outros sistemas externos possam interagir com eles.

A composição de módulos é gerida por um sistema de licenciamento e por permissões orientadas ao perfil (role do utilizador). A face visível dessa composição é o menu da aplicação.

A aplicação é multi-tenant, por isso permite hospedar tantos clientes quantos necessários na mesma infraestrutura.

Aplicação Elevation

A modularidade é um aspeto crucial das aplicações porque permite a agregação de funcionalidades e o seu desenvolvimento autónomo. É um conceito inerente à Plataforma Elevation.

Por exemplo, no Jasmin, os módulos são os seguintes:

Aplicação Elevation

Um módulo só pode referenciar serviços através da API interna de módulos abaixo ou ao mesmo nível no diagrama.

Módulos de Plataforma

A Plataforma Elevation disponibiliza de base os seguintes módulos que são utilizados por todas as aplicações:

Core Patterns

Implementa um conjunto de padrões de negócio transversais a todas as aplicações, para além de vários componentes runtime de negócio (exemplos: audit, schema, etc.).

Identity

Descreve as entidades de gestão de utilizadores e permissões e os componentes cliente do Identity Server, a solução de single sign-on da Plataforma.

Operations

Implementa padrões de negócio de índole mais operacional (notificações, audit, etc.), transversais, e os respetivos componentes runtime.

QueryBuilder

Disponibiliza componentes de gestão e apresentação de listas das entidades da aplicação.

Reporting

Implementa os componentes de impressão de entidades e de documentos disponíveis para as aplicações.

Shell

Disponibiliza o runtime da shell - o ambiente de execução cliente da aplicação. Estes componentes asseguram os comportamentos de apresentação que serão idênticos entre todas as aplicações (o menu, a área de navegação, gestão das views, responsive design, etc.).

Arquitetura de um Módulo

O diagrama seguinte apresenta uma visão sumarizada da arquitetura de cada módulo da aplicação.

Módulo Elevation

Um módulo divide-se em 2 layers físicos:

  • Os componentes cliente (que executam no browser).
  • Os componentes servidor (que executam no servidor Web).

Esses componentes estão divididos em 4 layers lógicos:

  • Presentation – componentes que lidam com o UI da aplicação.
  • Services – serviços aplicacionais públicos (API) e internos.
  • Domain – componentes que implementam a lógica de negócio.
  • Data – componentes que lidam com a persistência dos dados.

O cliente Elevation comunica com o servidor através de uma API interna JavaScript/REST que acede aos serviços do respetivo módulo.

Aplicações externas (de parceiros) comunicarão com o sistema através de uma Web API.

A integração entre módulos é realizada através de application services (uma espécie de versão da Web API com funcionalidades adaptadas à integração).

Layers Lógicos

Estes layers lógicos do módulo podem ser visualizados na seguinte perspetiva:

Layers Lógicos

Api

Esta camada (Company.Module.Api.dll) define os contratos dos application services e os respetivos resources. Esta é a Integration API.

Esses application services são utilizados pelos módulos para comunicarem entre si. Ou seja, o módulo X apenas pode referencias esta livraria do módulo Y e utilizar esses application services e resources para transferir dados.

Domain Entities

Esta livraria (Company.Module.Domain.Entities.dll) define as entidades de negócio (business entities), declaradas como POCO, que são utilizadas pelas camadas Domain e Data para fazer a persistência dos dados.

Entity Context

Este componente (em Company.MOdule.Data.dll) - existe apenas um por módulo - é responsável pela persistência dos dados na base de dados. Utiliza a Entity Framework como ORM.

Business Managers

Os business managers (ou apenas managers) (em Company.Module.Domain.dll) são os componentes que implementam a lógica de negócio principal do módulo. São tipicamente invocados pelos services managers e delegam as operações de acesso a dados no Entity Context.

Services Managers

Estes componentes (em Company.Module.Domain.dll) fazem a adaptação dos serviços para a camada de negócio (os business managers). Tipicamente disponibilizam operações sobre os resources e fazem o seu mapeamento para domain entities que o business manager processa depois.

Services Controllers

Os services controllers (em Company.Module.Services.Controllers.dll) definem a camada de serviços do módulo. São classes que representam a API do módulo, divida em duas:

  • Application API é a API usada pela própria aplicação, a partir da shell. Corresponde aos service controllers APP.
  • Public API é a API pública do módulo (Web API). Corresponde aos serviços API.

A diferença mais substancial entre as duas API está relacionada com os drafts, disponíveis apenas a partir da primeira.

CoreLib

O runtime da Plataforma, para além dos módulos de plataforma, já referidos, é publicado por dois grandes grupos de componentes: a CoreLib e a Core.

A CoreLib é um conjunto de livrarias com funcionalidades transversais muito genéricas, utilizadas pela Plataforma e pelas aplicações Elevation mas que tem duas particularidades:

  • Tem um roadmap autónomo, independente da evolução da plataforma (tipicamente mais estável).
  • Pode ser utilizada em qualquer aplicação, mesmo que não utilize nenhum outro componente da Plataforma Elevation.

As funcionalidades disponibilizadas por esta livaria vão desde coisas muito simples como a validação de argumentos de métodos até componentes mais complexos de tracing, storage, telemetria, etc.

Componentes Core

Já os componentes Core são específicos da Plataforma Elevation e estão desenhados para trabalharem em conjunto com os restantes módulos da Plataforma e da aplicação.

Tipicamente, fornecem funcionalidades e comportamentos transversais a todos os módulos e caracter mais básico (como, por exemplo, o arranque da aplicação ou a gestão de application services, assim como modelos de dados usados por componentes implementados nos módulos da Plataforma).

O diagrama seguinte ilustra a organização lógica dos componentes Core:

Componentes Core

Identity Server

O Identity Server é a peça da plataforma responsável pela identidade e autorização dos utilizadores e o single sign-on.

Identity Provider