Mi scuso per la lunga domanda, si legge un po 'come una sfuriata, ma prometto che non lo è! Ho riassunto la mia domanda / e di seguito
Nel mondo MVC, le cose sono semplici. Il modello ha lo stato, la vista mostra il modello e il controllore fa cose a / con il modello (in pratica), un controllore non ha stato. Per fare il controller ha alcune dipendenze da servizi web, repository, il lotto. Quando installi un controller a cui tieni a fornire tali dipendenze, nient'altro. Quando si esegue un'azione (metodo su Controller), si utilizzano tali dipendenze per recuperare o aggiornare il modello o chiamare un altro servizio di dominio. Se c'è un contesto, dì che alcuni utenti vogliono vedere i dettagli di un particolare oggetto, si passa l'Id di quell'elemento come parametro all'azione. Da nessuna parte nel controller c'è alcun riferimento a qualsiasi stato. Fin qui tutto bene.
Immettere MVVM. Amo WPF, adoro il binding dei dati. Adoro i framework che rendono ancora più semplice l'associazione dei dati a ViewModels (utilizzando Caliburn Micro a.t.m.). Sento che le cose sono meno dirette in questo mondo. Facciamo di nuovo l'esercizio: il Modello ha lo stato, il View mostra ViewModel, e il ViewModel fa cose a / con il Modello (in pratica), un ViewModel ha lo stato! (per chiarire, forse delega tutte le proprietà a uno o più Modelli, ma ciò significa che deve avere un riferimento al modello in un modo o nell'altro, che è lo stato in sé) Per fare riempire il ViewModel ha alcune dipendenze da servizi web, repository, il lotto. Quando installi un ViewModel a cui tieni a fornire tali dipendenze, ma anche lo stato. E questo, signore e signori, mi infastidisce fino alla fine.
Ogni volta che hai bisogno di istanziare un ProductDetailsViewModel
da ProductSearchViewModel
(da cui hai chiamato ProductSearchWebService
che a sua volta ha restituito IEnumerable<ProductDTO>
, tutti sono ancora con me?), puoi fare una di queste cose:
- chiama
new ProductDetailsViewModel(productDTO, _shoppingCartWebService /* dependcy */);
, questo è male, immagina altre 3 dipendenze, questo significa cheProductSearchViewModel
deve assumere anche queste dipendenze. Anche cambiare il costruttore è doloroso. - chiama
_myInjectedProductDetailsViewModelFactory.Create().Initialize(productDTO);
, il factory è solo un Func, sono facilmente generati dalla maggior parte dei framework IoC. Penso che questo sia male perché i metodi Init sono un'astrazione che perde. Non è inoltre possibile utilizzare la parola chiave readonly per i campi impostati nel metodo Init. Sono sicuro che ci sono altri motivi. - chiama
_myInjectedProductDetailsViewModelAbstractFactory.Create(productDTO);
Quindi ... questo è il modello (factory astratto) che di solito è raccomandato per questo tipo di problema. Pensavo fosse geniale dal momento che soddisfaceva la mia brama di digitazione statica, finché non ho iniziato a usarlo. La quantità di codice boilerplate è penso troppo (sai, a parte i ridicoli nomi delle variabili che uso). Per ogni ViewModel che richiede i parametri di runtime, si otterranno due file aggiuntivi (interfaccia di fabbrica e implementazione) e sarà necessario digitare le dipendenze non di runtime come 4 volte in più. E ogni volta che cambiano le dipendenze, puoi cambiarlo anche in fabbrica. Sembra che non usi più nemmeno un contenitore DI. (I pensa Castle Windsor ha qualche tipo di soluzione per questo [con i suoi stessi svantaggi, correggimi se sbaglio]). - fai qualcosa con tipi o dizionari anonimi. Mi piace la mia digitazione statica.
Quindi, sì. Lo stato e il comportamento di miscelazione in questo modo crea un problema che non esiste affatto in MVC. E mi sembra che al momento non ci sia una soluzione adeguata per questo problema. Ora mi piacerebbe osservare alcune cose:
- Le persone utilizzano effettivamente MVVM. Quindi non si preoccupano di tutto quanto sopra, o hanno qualche altra brillante soluzione.
- Non ho trovato un esempio approfondito di MVVM con WPF. Ad esempio, il progetto campione NDDD mi ha aiutato immensamente a comprendere alcuni concetti DDD. Mi piacerebbe davvero che qualcuno mi indicasse qualcosa di simile a MVVM / WPF.
- Forse sto facendo l'MVVM in modo sbagliato e dovrei rovesciare il mio progetto. Forse non dovrei avere questo problema. Beh, so che altre persone hanno fatto la stessa domanda quindi penso di non essere l'unico.
Per riepilogare
- Sono corretto nel concludere che il fatto che ViewModel sia un punto di integrazione sia per lo stato sia per il comportamento è la causa di alcune difficoltà con il pattern MVVM nel suo complesso?
- Sta usando il pattern factory astratto l'unico / miglior modo per istanziare un ViewModel in modo tipizzato staticamente?
- Esiste qualcosa come un'implementazione di riferimento approfondita disponibile?
- C'è un sacco di ViewModels con uno stato / comportamento un odore di design?