Saltar al contenido

Uso de varias instancias del mismo servicio

Hemos buscando por diferentes foros para brindarte la respuesta para tu duda, en caso de preguntas puedes dejar la duda y te contestamos porque estamos para ayudarte.

Solución:

Angular DI mantiene una sola instancia por proveedor. En su caso, si tiene dos parámetros de constructor con el mismo tipo, se resuelven en la misma instancia.

Lo que puede hacer es proporcionar una función de fábrica (diferente de una simple useFactory evento del proveedor aunque también lo usa)

(Ejemplo copiado de https://stackoverflow.com/a/37517575/217408)

 provide: EditorService, useFactory: 
    (dep1, dep2) => 
        return (x) =>  
            new EditorService(x, dep1, dep2);
        
    , deps: [Dep1, Dep2]
)

....

constructor(@Inject(EditorService) editorServiceFactory: any) 
  let editorService1 = editorServiceFactory(1);
  let editorService2 = editorServiceFactory(2);

Si tiene un número fijo de instancias, esto debería funcionar:

 provide: 'instance1', useClass: EditorService ,
 provide: 'instance2', useClass: EditorService ,
export class SomeComponent 
    constructor(
        @Inject('instance1') private _appleEditorService: EditorService,
        @Inject('instance2') private _pearEditorService: EditorService) 

tal vez reconsidere su diseño

Creo que quizás tengas que repensar tu diseño por completo entonces. ¿Cuál es el punto de tener dos variables que apuntan exactamente al mismo EditorService? Si ellos Cuota la misma implementación.

solución de herencia

Una solución a esto sería quizás usar Herencia. No he visto sus servicios, así que no estoy seguro de lo que hacen, pero a partir de este código asumo que la funcionalidad de “manzana” y la funcionalidad de “pera” son realmente diferentes. Entonces, esto indica que es posible que tenga algunos problemas de diseño y que su EditorService podría estar haciendo demasiado. Tal vez podría mover el código que es similar tanto para Apples como para Pears a un servicio llamado EditorService y luego hacer que dos clases amplíen esto. un AppleEditorServicey un PearEditorService.

Usar fruitService general

Solo para hablar un poco más sobre por qué creo que es posible que deba repensar su diseño. Supongamos que las manzanas y las peras tienen la misma funcionalidad. Entonces el EditorServicehace lo mismo Desea que se use una variable para ‘Manzanas’ y otra para ‘Peras’. Si veo ese código (suponga que otras personas trabajan en su equipo), y noto que ambas variables apuntan al mismo servicio. (Los servicios son únicos), estaría tentado a eliminar eso y hacer algo como fruitService : EditorServiceo algo por el estilo.

De cualquier manera, su pregunta me hace pensar que el diseño debería cambiarse. No desea dos instancias del servicio, los servicios son únicos y, aunque pudo encuentre formas de evitarlo, no creo que esa sea realmente la solución a su problema.


Pero como he comentado antes. Piensa en tu diseño. ¿Realmente necesita dos servicios para niños, o puede resolverlo de manera diferente? ¿Puedes tener manzanas y peras como subclase de fruta? ¿Puedes usar una variable ‘servicio de frutas’ en lugar de manzanas/peras? ¿Qué sucede cuando también desea almacenar “Fresas” en el futuro? Tener un montón de variables se refieren al mismo servicio (porque hacen lo mismo) pero con diferentes nombres de variables es no una buena idea. Imagina ver esto en código

 appleService = EditorService;
 pearService = EditorService;
 starwberryService = EditorService;
 lemonService = EditorService;
 ...
 guavaService = EditorService;

¿Esto no indicaría que algo es extraño con el código? Puedo imaginar (no proporcionó el código en este punto) que almacena una matriz de fruitInstances. Pero entonces tal vez podría funcionar un fruitService y luego almacenar fruitService.store (Apple a) y ponerlo en un array de fruta’. Use un ‘filtro’ para obtener la fruta correcta del array no debería ser demasiado difícil.

^ Esto solo está escrito sin tener más de su código para continuar. Si edita su pregunta, es posible que algunas cosas ya no se mantengan.

Si te gusta la programación, tienes la libertad de dejar un post acerca de qué le añadirías a este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *