Instantiating classe A che viene iniettata dalla classe B, che viene iniettata dalla classe C e così via

0

Quindi dato un file di configurazione che ha tutti i parametri non oggetto necessari per creare una classe come questa:

{
  "component1": {
    "name": "C1",
    "parameters": {
      "p1": <component2>,
      "p2": <component3>
    }
  },
  "component2": {
    "name": "C2",
    "parameters": {
      "p1": 1
    }
  },
  "component3": {
    "name": "C3",
    "parameters": {
      "p1": <component2>
      "p2": "hello"
    }
  }
}

Quindi, visto il file qui sopra, dovrei creare component2 prima perché non ha dipendenze, quindi component3 , poi component1 .

Mi stavo chiedendo come risolvere il problema dell'ordine in cui dovrei creare un'istanza degli oggetti.

Quindi l'input della funzione sarebbe il file sopra, e l'output della funzione sarebbero le classi istanziate.

Ho pensato in due modi:

1. Costruzione di un DAG per le dipendenze, in questo caso:

                      component2.p1 = 1
                          /
                     component2  
                        /     \ 
                   component3  \                          
                        \       \
                         component1

Quindi usa BFS per fare un ordinamento topologico per capire quali classi istanziare.

2. Utilizza un pattern Observer In questo caso, c'è un oggetto per ogni componente che è responsabile di essere il soggetto e l'osservatore. Usando il componente 3 come esempio, l'oggetto sarebbe un osservatore (dei parametri necessari per istanziare il componente 3) e anche un soggetto, quindi quando viene notificato che il componente 2 viene creato e il componente 3 viene istanziato, l'osservatore per il componente 1 è stato notificato Sebbene ciò possa causare loop ...

Ho la sensazione che possa essere un problema che altre persone hanno dovuto affrontare, ma non ho ancora trovato una soluzione per questo. Qualche consiglio o qualcuno potrebbe indicarmi la risorsa pertinente?

    
posta YellowPillow 01.06.2018 - 12:41
fonte

0 risposte

Leggi altre domande sui tag