Impedica invocazione ripetuta di eventi

1

Ho un oggetto genitore, con più oggetti figlio. Ogni oggetto figlio è dello stesso tipo e ha un "ChildMethod" che contiene una logica specifica per figlio. Se ChildMethod viene chiamato su qualsiasi figlio, voglio serializzare lo stato di tutti i bambini. Ho messo quella logica nell'oggetto genitore. Inoltre l'ho implementato con lo schema dell'osservatore, i bambini sono i soggetti e il genitore l'osservatore. Funziona bene finora. Ora ho bisogno di un altro metodo "CallAllChildMethods", che in pratica chiama ChildMethod su ogni bambino, ma voglio evitare più serializzazioni, poiché è necessario farlo solo una volta.

L'unica soluzione che vedo al momento è di annullare l'iscrizione a tutti i subjectevents prima di chiamare CallAllChildMethods, quindi di riscrivere di nuovo. Funziona ma è un odore di design pesante. Ci sono, da un punto di vista del design, modi più puliti per gestire quel caso?

    
posta Egi 02.04.2017 - 02:52
fonte

1 risposta

2

Oof, sembra che quell'oggetto sia diventato molto intricato.

Vorrei rivalutare i tuoi criteri. Non è così semplice come "serializzare dopo ogni modifica", così difficile da codificare nel tuo design di oggetti significa solo che devi modificarlo più tardi.

Sembra che tu voglia un equivalente di ambito di transazione, consentendo di eseguire le modifiche del bambino una alla volta per impostazione predefinita, ma anche di raggrupparle insieme in una transazione, se necessario.

Si può passare questo oggetto scope ai metodi child.Change, ma sarà brutto. Se si sta iniettando un oggetto repository per implementare il salvataggio, si potrebbe forse esporre un ambito di transazione su questo.

Dall'evento continuerebbe a sparare repository.Save () ma nel tuo metodo batch dovresti fare qualcosa di simile ..

repository.BeginTransaction() //flags Save() to be ignored
foreach(child in childern) {
    child.Change(); //calls repository.Save()
}
repository.CommitTransaction() //removes flag and calls Save()

Ovviamente ci sono alcune complessità attorno al threading e cose che potresti dover prendere in considerazione. Ma ti viene l'idea

    
risposta data 02.04.2017 - 06:21
fonte

Leggi altre domande sui tag