Providers and Injections should be by name or at least by Map<string,type> and not by a simple Array<type>
- Lenguaje dominante
- TypeScript
- Estrellas
- 7.8k
- Forks
- 2.2k
- Merge medio
- 22 h 28 min
- PR fusionados (30 d)
- 6
Descripción
### Version info
**Angular:** 14.2
**Firebase:** 9.9.3
**AngularFire:** 7.4.1
**Other (e.g. Ionic/Cordova, Node, browser, operating system):** Irrelevant
### Expected behavior
Provide / Injection by name or Map where the string is the name to find easy and clean your angular firebase components or have a function to findByName(name: string).
I'm not talking only about Auth, I'm talking regarding all your types but I use Auth for the examples
``` typescript
@NgModule({
imports: [
provideFirebaseApp(() => initializeApp(config)), // default app
provideFirebaseApp(() => initializeApp(config2, 'app2')),
provideFirebaseApp(() => initializeApp(config3, 'app3')),
provideAuth(() => getAuth()), // from default app
provideAuth(() => getAuth(getApp('app2'))),
provideAuth(() => getAuth(getApp('app3'))),
],
})
```
One of the next options should be there to be use it easy:
**Option 1** - Could be work with your actual Array but I think that search this search byName in this array is dirty and I recommend to not reinvent the wheel and use a Map
``` typescript
constructor(
private authApp: Auth,
private authApp2: AuthInstances.getByName('app2'),
private authApp3: AuthInstances.getByName('app3'),
) { }
```
**Option 2** - Could be work with your actual Array but again I recommend to not reinvent the wheel and use a Map
``` typescript
constructor(private authInstances: AuthInstances) { }
doWithAuth(name: string) {
const auth = this.authInstances.getByName(name)
// the things that you want to do with your auth
}
```
**Other options** - Any idea that let you select your angular fire element more easy and clean that now.
### Actual behavior
Provide / Injection is a simple Array and does not have any method to select by name.
``` typescript
@NgModule({
imports: [
provideFirebaseApp(() => initializeApp(config)), // default app
provideFirebaseApp(() => initializeApp(config2, 'app2')),
provideFirebaseApp(() => initializeApp(config3, 'app3')),
provideAuth(() => getAuth()), // from default app
provideAuth(() => getAuth(getApp('app2'))),
provideAuth(() => getAuth(getApp('app3'))),
],
})
```
``` typescript
private authMap: Map;
constructor(private authInstances: AuthInstances) {
this.authInstances.forEach(auth => {
this.authMap.set(auth.name,auth);
});
}
```
### Feedback
I think that your Provide / Injection should work with maps or with something that can be select the future injection by name.
Another important thing, is that you must declare a default app, if not the AuthInstaces fail because default app is not initializate and then to find this default app is so ugly `name: "[DEFAULT]"`
To finish, you cannot import only one auth if your auth is not default, because you have a way to import default and to import an array with default and another auths. Is there a way to inject `auth: Auth` by name and avoid import all the array?
Issue post from discussion: _Originally posted by @todosybuenrollo in https://github.com/angular/angularfire/discussions/1026#discussioncomment-3613308_
Guía de contribución
Línea de trabajo
Comienza rastreando los puntos de entrada provideFirebaseApp, provideAuth y AuthInstances descritos en el issue, incluido cómo se resuelven las aplicaciones Firebase predeterminada y con nombre. Revisa el comportamiento actual de la inyección y las pruebas relacionadas, si existen, antes de decidir entre la inyección con nombre y una API basada en mapas. La tarea estará terminada cuando los consumidores puedan seleccionar instancias de Auth no predeterminadas por nombre sin tener que recorrer manualmente un array, preservando al mismo tiempo el comportamiento de la aplicación predeterminada.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- angular, firebase, typescript
- Área
- backend-api-design
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 28/100