pedrolemoz/asp_example

Persistência de estado

jhonatan-rosario opened this issue · 2 comments

Muito bom o seu exemplo utilizando o atomic state pattern.
Como ficaria a persistência do estado de usuário logado em algum banco NoSQL como o Objectbox, Isar, Realm...?

Olá, @jhonatan-rosario.

Idealmente, a camada de persistência de dados deve ser desacoplada da camada de interface do usuário. Este exemplo cobre apenas a simulação de um sistema de autenticação simples, pois o maior objetivo aqui é validar o Atomic State Pattern em um cenário mais realista. Entretanto, você poderá observar que os reducers possuem o AuthenticationService como dependência em seus construtores. Assim, toda a lógica relacionada à camadas externas, como bancos de dados, APIs e SDKs de terceiros (como o Firebase, por exemplo) são isolados da camada de apresentação.

Note que este serviço de autenticação é apenas uma simulação. Primeiro, é realizada uma validação inicial dos dados de entrada, que são recebidos por meio de um DTO. Para simular uma requisição HTTP, inseri um delay de 1 segundo na execução das funções. Você poderia facilmente substituir este código por uma outra implementação que fizesse uma requisição HTTP real, com os pacotes http, dio, uno, ou até mesmo com o cliente padrão do dart:io.

Assim sendo, a persistência de dados em um banco NoSQL como os que você citou também seguiriam uma estrutura semelhante. Você poderia criar um serviço chamado DataBaseService que abstraísse o funcionamento das bases de dados para a sua aplicação. De modo geral, você precisaria criar métodos para salvar, recuperar, deletar e verificar a existência dos dados. Daí, o seu reducer poderia consumir esse serviço conforme a necessidade.

Entretanto, o que eu recomendo é que você utilize abstrações, e que crie mais componentes intermediários ao invés de efetuar todas as operações na base de dados. Veja a arquitetura limpa, por exemplo. Lá, há um caso de uso que encapsula regras de negócio, uma infraestrutura que lida com múltiplas fontes de dados e uma camada extra que interage com o mundo externo. O reducer consumiria o caso de uso.

Obrigado pelo retorno. Já estou tentando implementar a persistência de dados usando a arquitetura limpa.