Come gestire la dipendenza tra due oggetti non correlati?

1

Sto cercando di capire un modo per risolvere il seguente problema di dipendenza.

Ho un oggetto genitore DomManager che ha la responsabilità di gestire tutte le interazioni con il DOM. Inizializza diversi moduli e due sono dipendenti l'uno dall'altro: PlayerDom e Sticky .

Ad un certo punto, il metodo di PlayerDom deve chiamare un metodo di Sticky (e viceversa).

Dopo diverse iterazioni, ho trovato la seguente implementazione:

DomManager

var DomManager = {
// General configuration
config: null,

// Modules container
modules: {},

/**
 * Initialization function
 *
 * @param config - Configuration object
 * @returns {DomManager} - DomManager object
 */
init: function(config) {
    this.config = this.setConfig(config);

    this.initModules();

    return this;
},

setConfig: function(config) {
    return config;
},

/**
 * Invoke a service from a particular module
 *
 * @param moduleName - Module name
 * @param service - Method name to be invoked
 * @param args - Optional method parameters
 */
invoke: function(moduleName, service, args) {
    if (this.modules[moduleName] && typeof this.module[moduleName][service] === 'function') {
        this.modules[moduleName][service](args);
    }
},

/**
 * Initializes all modules it depends on
 */
initModules: function() {
    // Initialize player DOM manager
    this.modules['playerDom'] = PlayerDom.init(this.config.playerDom);

    // Stickiness is NOT enabled on videogallery
    if (this.config.sticky.enabled) {
        this.modules['sticky'] = Sticky.init(this.config.sticky);
    }

    // Top leaderboard stickiness is enabled only on mobile
    if (this.config.topLeaderBoard.enabled) {
        this.modules['topleaderboard'] = TopLeaderBoard.init(this.config.topLeaderBoard);
    }

    // Read more is enabled only if the following conditions are met:
    // - Template A
    // - One of: Facebook Referrer, Mobile, Tablet
    if (this.config.readMore.enabled) {
        this.modules['readMore'] = ReadMore.init(this.config.readMore);
    }
}

};

Quindi quando PlayerDom deve chiamare un servizio di Sticky , deve chiamare, ad esempio, DomManager.invoke('sticky', 'enable') .

Potrebbe essere una buona soluzione o c'è qualcosa di meglio?

    
posta Emanuele Gallo 05.06.2018 - 11:25
fonte

1 risposta

0

Come ho capito, DomManager nella tua implementazione è anche un manager DI. Se crea moduli al momento dell'inizializzazione, probabilmente ha senso aggiungere un metodo come DomManager.get (moduleName) o DomManager.inject (moduleName) e utilizzarlo nei moduli figlio in questo modo:

let sticky = DomManager.get(Sticky);
sticky.doSomething();

Tale approccio è utilizzato in Angular, quando ci sono servizi dipendenti l'uno dall'altro: link

    
risposta data 07.06.2018 - 15:37
fonte

Leggi altre domande sui tag