Eu criei talvez cinco serviços como RoleService
, AuthService
, etc. Cada um deles tem algum estado (por exemplo, RoleService.role
, AuthService.isLoggedIn
) afetando muitos controladores e alguns outros serviços e diretivas.
Às vezes preciso $watch
da variável, então minha solução hacky era colocar todo o serviço no $scope
dos controladores que precisam dele. Eu até coloquei um dos serviços no $rootScope
, o que me faz sentir mal, mas foi muito prático.
Qual é a prática recomendada para assistir ao estado do serviço?
Agora, tenho a ideia de criar um BaseService
como um contêiner de dados para todas as variáveis interessantes (talvez cinco). Não haveria métodos, pois eles pertencem aos serviços onde estão agora. Isso não soa como OO, mas simplifica as coisas e remove as dependências entre os serviços:
Todos dependeriam do BaseService
e seriam independentes. Não prejudicará os testes, pois BaseService
é trivial para preencher os dados. Eu não vejo nenhuma desvantagem, mas não parece muito certo.
Esta é uma boa ideia? Quais alternativas melhores existem?
Ninguém respondeu, então tentei e funciona bem, apesar de BaseService
agregar variáveis não relacionadas. Uma solução teoricamente mais limpa poderia ser criar um detentor de dados para cada serviço, algo como RoleService + RoleHolderService
, AuthService + AuthStateHolderService
, etc. Agora, os detentores dependeriam de nada e seu conteúdo deve ser tratado como lido somente por tudo além do serviço correspondente, isto é, RoleHolderService.role
pode ser escrito somente pelo RoleHolderService
.
Praticamente , agregar todos os titulares em um único serviço não é problema. A informação se uma parte do programa quer ler a função do usuário ou se ele está logado está perdido, mas não é uma grande perda, pois há tantos leitores assim. Controladores e serviços alterando esse estado fazem isso somente por meio de um método do serviço correspondente (por exemplo, AuthService.login
).