Collega gli osservatori a osservabili automaticamente usando il contenitore di iniezione delle dipendenze

3

Ho diversi servizi che implementano un'interfaccia Observer e un servizio che implementa la corrispondente interfaccia osservabile.

Attualmente sto usando l'unità insieme a Prism, quindi preferirei mantenere questa combinazione. La mia soluzione attuale è di iniettare il servizio osservabile nei servizi di osservazione e lasciare che gli osservatori si iscrivano. Non sono sicuro che questo sia un buon progetto dal momento che l'osservatore non dipende realmente dall'osservabile.

C'è un modo per associarli automaticamente usando un contenitore per le dipendenze? C'è un altro modo?

    
posta Jef Patat 30.06.2017 - 08:30
fonte

1 risposta

3

Il vantaggio del tuo attuale design è che gli osservatori possano controllare QUANDO stanno osservando. Quando un osservatore vuole iniziare a osservarlo registra (o si abbona se vuoi) con l'oggetto osservato (soggetto) chiamando un metodo di registrazione e passando un riferimento a se stesso.

All'interno dell'osservatore:

subject.register(this)

dopo

subject.unregister(this)

Sei preoccupato per questo creando una dipendenza non necessaria. L'unica dipendenza qui è nell'interfaccia del soggetto che garantisce che siano registrati e annullano la registrazione dei metodi da chiamare. Oh, e hai bisogno di un riferimento all'argomento.

Quindi non è tanto una questione di dipendenza. È una questione se vuoi che i tuoi osservatori siano responsabili di decidere quando osservano.

Se non vuoi che i tuoi osservatori abbiano la responsabilità di decidere quando osservano, hai bisogno di una terza cosa che si assumerà questa responsabilità.

È possibile fornire il soggetto con la sua lista di osservatori quando costruisce il grafico dell'oggetto. Dovrai chiamare ripetutamente un setter sull'argomento, chiamare un costruttore che prende un numero variabile di argomenti o passargli una raccolta di osservatori.

Se il tuo contenitore DI può fare qualcuna di queste allora può essere la tua "terza cosa". In caso contrario, potrebbe essere necessario scrivere codice di costruzione che funga da "terza cosa".

    
risposta data 30.06.2017 - 11:33
fonte