Skip to content

Definición y Registro de Providers

Un Provider es un tipo de estructura Injectable que debe ser instanciada y registrada manualmente en el contenedor de dependencias.

Este tipo de estructura es responsable de proporcionar lógica de conexión a servicios externos, como bases de datos o APIs.

Definir un Provider

Para definir un Provider debes usar el atributo #[injectable(provider)] en la definición de la estructura.

rust
#[injectable(provider)]
pub struct Database {
    pool: Arc<PgPool>,
}

impl Database {
    pub async fn new(db_conf: DatabaseConfig) -> Self {
        let pool = PgPool::connect(&db_conf.uri)
            .await
            .expect("Failed to create Postgres connection pool");

        Self {
            pool: Arc::new(pool),
        }
    }

    pub fn get_pool(&self) -> PgPool {
        &self.pool
    }
}

Luego, puedes registrar una instancea de este Provider en el contenedor de dependencias en un módulo o bien de forma global.

Registrando un Provider

Registro en un Module

rust
impl Module for SomeModule {
    async fn register_providers(config: &Config, providers: &ProviderRegistry) {
        let db_config = config.expect::<DatabaseConfig>();
        let database = Database::new(db_config)
            .await
            .expect("Failed to create Database provider");

        providers.register(database);
    }
}

Registro Global

Si un Provider no pertenece a un módulo o en especifico, o por alguna otra razón quieres mantenerlo separado, puedes registrarlo directamente en el ApplicationBuilder.

rust
let db_provider = Database::new(db_conf)
    .await
    .expect("Failed to create Database provider");

Application::builder()
    .with_module::<SomeModule>()
    .with_provider(db_provider)
    .build();