Componentes
O Vaden fornece um sistema de injeção de dependência (DI) poderoso e intuitivo inspirado em frameworks como Spring Boot. Ele utiliza anotações para registrar e injetar dependências em toda a aplicação de forma modular e escalável.
O Fundamento da Injeção
A anotação @Component()
é a base para todas as classes injetáveis. Qualquer classe anotada com @Component()
é automaticamente descoberta e registrada no contêiner de DI da aplicação.
()
class Logger {
void log(String message) => print('[LOG] $message');
}
Você pode injetar isso em outros componentes via injeção por construtor:
()
class UserService {
final Logger logger;
UserService(this.logger);
void createUser() => logger.log('User created');
}
Por baixo dos panos, @Service
, @Repository
, e @Bean
são todas especializações de @Component
.
@Service()
e @Repository()
Essas anotações são atalhos semânticos para indicar o propósito de uma classe:
@Service()
é usado para classes de lógica de negócio.@Repository()
é usado para camadas de acesso a dados e persistência.
()
class UserRepository {
List<String> findAllUsers() => ['Alice', 'Bob'];
}
()
class UserService {
final UserRepository repository;
UserService(this.repository);
List<String> getUsers() => repository.findAllUsers();
}
Elas se comportam igual a @Component()
, mas ajudam na legibilidade do código e no suporte futuro de ferramentas.
Configuração
Em alguns casos, você pode querer registrar uma classe manualmente ou configurar uma instância que requer parâmetros (como credenciais ou dados de ambiente). Para isso, você pode usar @Configuration()
com métodos @Bean()
:
()
class AppConfiguration {
()
Logger logger() => Logger();
()
Future<ApiClient> api(ApplicationSettings settings) async {
return ApiClient(baseUrl: settings['api']['url']);
}
}
- Beans podem ser síncronos ou assíncronos (
Future<T>
). - Parâmetros são automaticamente resolvidos pelo contêiner.
Ciclo de Vida & Resolução
Todas as classes são singletons por padrão — o que significa que a mesma instância é reutilizada em toda a aplicação. A injeção de dependência funciona em:
- Controladores
- Serviços
- Repositórios
- Middlewares
- Guards
- Beans (métodos @Bean())