È una buona idea aggiungere ViewModel esattamente come il modello


16

Ho i seguenti livelli nella mia soluzione:

  1. App.Domain
  2. App.Service
  3. App.Core (forse si chiama questo App.DataLayer)
  4. App.Web

Il modello di progettazione del software non è la mia domanda, ho il seguente modello in Domain

public class Foo {
    public int Id {get;set;}
    public int Name {get;set;}
    public int Value {get;set;}
}

Voglio usare questo modello sulla vista (ad esempio la home page) E voglio usare Id, Name & Value, quindi se voglio creare ViewModel, aggiungerò quanto segue:

public class FooViewModel {
    public int Id {get;set;}
    public int Name {get;set;}
    public int Value {get;set;}
}

Quindi, è una buona idea? o semplicemente usare Fooinvece di FooViewModel?


Non sono sicuro di capirlo. Il Modelsolito non è passato al View? Perché esattamente hai bisogno di ricreare i campi di Modelin View? Se la separazione delle preoccupazioni è un obiettivo MVC, in quali circostanze si vorrebbe fare la stessa cosa con Modele View? Se ViewModelè entrambi, perché non estendere / comporre entrambi Modele View?
null

per favore leggi i miei commenti sulla risposta di @ svidgen
Mehdi Dehghani,

Ho un problema correlato - in cui la convalida (attributo obbligatorio) sui modelli (e nel database) afferma che devono essere immessi determinati valori - ma nelle viste, tali valori non devono essere - quindi sono costretto a copiare alcuni campi da i modelli nel modello di visualizzazione, anziché fare riferimento direttamente al modello. Tuttavia, riflettendo questo probabilmente va bene e in effetti non viola DRY in quanto sono per scopi diversi (non troppo male comunque).
Niico,

Risposte:


20

Questo può sembrare inizialmente una violazione della regola DRY, ma direi che "codice simile e persino identico" non è necessariamente "ripetizione" se fa qualcosa di diverso o è in grado di cambiare in modo indipendente. E nel caso dei modelli di vista, il codice definisce ciò che vede il "cliente", non necessariamente le entità e le operazioni di cui parla l'azienda. Quindi, stai spesso rivelando al client o all'interfaccia modelli che sono "casualmente identici". È possibile modificare le regole e i termini aziendali o la terminologia dell'utente finale indipendentemente l'uno dall'altro.

Quindi, vorrei rivolgere la domanda a te. Se il dominio cambia, è accettabile che i client "versione 1" continuino a utilizzare le vecchie interfacce? Rivelerai mai termini o operazioni nell'interfaccia che non fanno parte delle "regole del core business"? E viceversa?

Quel tipo di domande in mente, se la "funzione" della tua vista è quella di rivelare rigorosamente il modello di dominio sottostante, sì, questo sembra violare la regola DRY.

Inoltre, tieni presente che in alcune lingue è possibile realizzare una visione che cambia in modo più naturale con le modifiche del modello con attributi e riflessioni dei membri. (O con meno ripetizioni attraverso altre imprese di intelligenza ... Ma, "intelligenza" spesso non riesce a giustificare la ripetizione che ti risparmia.)


Belle note menzionate (vota per questo), come ho detto come commento alla risposta precedente, sto parlando di scopi generali, imaging, forse alcuni giorni dopo, ho deciso di aggiungere un nuovo campo / proprietà a Foo, quindi se ho usato Foocome ViewModel anche il client otterrà anche nuove proprietà, quindi se questo nuovo fosse un campo di sicurezza (forse vero / falso per autorizzazione o qualcosa del genere), cosa dovrei fare?
Mehdi Dehghani,

@mehdi dovrai essere più specifico su quale campo stai pensando di aggiungere e perché pensi che appartenga o meno alla vista. O in generale, qual è la preoccupazione.
svidgen,

@mehdi per essere chiari, se sei preoccupato che gli utenti finali cambino un valore di sicurezza, il tuo dominio semplicemente non dovrebbe consentire agli utenti di salvare cose che non sono autorizzati a salvare
svidgen

Perché utilizziamo ViewModels? ci sono alcuni motivi, come sappiamo, uno di questi è per la sicurezza, ad esempio, User edit formnon è necessario passare il IsAdmincampo al client, per mantenere questo campo sicuro, quindi questo è ciò di cui mi preoccupo. scusa per il mio cattivo inglese.
Mehdi Dehghani,

1
In altre parole, penso che la domanda originale sia una domanda completa. La domanda che stai cercando di capire nei commenti qui è un'altra domanda completa. E i commenti non sono un buon modo per ottenere risposte valide e di qualità.
svidgen,

2

Avrei un modello di vista che conteneva solo una proprietà, un'istanza di Foo. In questo modo, non stai violando DRY secondo una sua definizione, se Foo cambia, il tuo modello di vista vede automaticamente il cambiamento e ti lasci libero da un legame diretto del modello di vista con il modello.

Se domani è necessario che la vista mostri qualcos'altro oltre al Foo, puoi semplicemente aggiungere una nuova proprietà e l'intento del tuo modello di vista sarà ancora chiaro, contiene un Foo e qualcos'altro, non avrai una miscela di proprietà di Foo con altre proprietà non correlate.

Non penserei al tuo modello di vista come a FooViewModel, lo penserei in termini di ciò che la vista dovrebbe mostrare. Se viene visualizzato solo un Foo, il modello di visualizzazione contiene una proprietà, un Foo.

Non sono sicuro di averlo spiegato chiaramente. In caso contrario, fammi sapere e proverò a riformularlo quando sono sveglio!


-2

Direi che l'utilizzo FooViewModelin questo modo viola il principio DRY. Quando è necessario apportare una modifica, Fooè necessario apportare anche una modifica a FooViewModel. Penso che saresti meglio servito semplicemente usando Foocome modello per la tua vista. Vorrei prendere in considerazione un modello di visualizzazione se è necessario visualizzare le cose da Foo e altre cose. Ad esempio, supponiamo che sia necessario eseguire il rendering di alcune informazioni da Fooe anche da Bar.


Per favore, dimmi, se ho deciso di aggiungere un altro campo / proprietà a Foo, quindi poiché ho usato Fooanche ViewModel, quindi devo passare anche questo nuovo campo alla vista, penso che questo non sia davvero un buon affare, cosa ne pensi ?
Mehdi Dehghani,

Non vedo nulla di male nel fatto che la vista usi solo un sottoinsieme dei dati esposti dal modello. Penso che il fallo più grande sia l'accoppiamento tra Fooe FooViewModel. In generale, non è una buona idea dover modificare più file per una singola modifica logica.
zero_dev

Che dire se quel campo aggiunto fosse un campo di sicurezza, come un true/falsevalore per l'autorizzazione o qualcosa del genere.
Mehdi Dehghani,

Non è necessario esporre tali campi nella vista stessa, ma è comunque necessario assicurarsi che il resto del codice non consenta all'utente di modificare il proprio livello di sicurezza, nel caso in cui un utente malintenzionato tenti di postare tale modifica.
Graham,

Sembra che sarebbe aperto agli attacchi di incarico di massa
James,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.