abbiamo una struttura gerarchica in cui ogni nodo è derivato da una classe di base del nodo public Node(INodeFactory nodeFactory)
. Il factory viene iniettato in modo che il nodo possa creare i suoi nodi figli utilizzando Get(int id)
In un secondo momento alcuni nodi necessitano di un riferimento a un altro nodo nella struttura. Le informazioni necessarie per ottenere il riferimento potrebbero cambiare in fase di esecuzione e non sono necessariamente disponibili Quando l'oggetto nodo è stato creato. Fondamentalmente questa firma del metodo ha lo stesso aspetto ed è Get(int id)
. Questa volta non dovrebbe essere creato alcun nuovo oggetto ma dovrebbe essere restituito uno esistente.
Il nostro primo tentativo è stato passare un INodeLocator
che avrebbe cercato il nodo. Prima di tutto non siamo sicuri che "locator" sia un buon nome e se qui mancano alcuni pattern, forse il pattern del repository (ma solo per cercare?). In secondo luogo abbiamo notato che la firma del metodo è la stessa.
Stavamo considerando di passare dalla modalità di "produzione" a quella di "ricerca" dopo che la struttura iniziale è stata creata, ma non funzionerà poiché in seguito sarà necessario creare anche i nodi.
Per la logica del 'localizzatore' stavamo pensando di cercare (iterando) attraverso i nodi, ma forse è meglio tenerne traccia in un dizionario piatto. Ma poi sorge il problema che la fabbrica può aggiungere al dizionario ma non gestisce la vita. Cosa dovrebbe accadere quando un nodo viene rimosso.
Modifica dopo la risposta di Vladimir Stokic: Al momento stiamo pensando a due soluzioni per mantenere pulito il dizionario. Uno è quello di avere un dizionario di riferimenti deboli ma poi spostiamo semplicemente il problema, ci saranno riferimenti deboli che devono essere rimossi (usando un segno di spunta timer di volta in volta?) La seconda idea è di fare in modo che il nodo notifichi la cancellazione della fabbrica .
Come possiamo progettare questo problema in modo appropriato?