È sicuro presumere che un controller utilizzerà sempre un solo modello primario?

7

Quindi sto progettando un framework MVC. Nel nome di mantenere tutto staticamente digitato e non magico, ho avuto un bel problema con il passaggio "automatico" dei modelli a un controller.

Quindi, tradizionalmente, di solito non vedo più di un modello alla volta in un controller per quanto riguarda la popolazione automatica.

Ad esempio, prendi questo tutorial. C'è un metodo come questo nel controller:

[HttpPost]
public ActionResult Create(Movie newMovie)
{

    if (ModelState.IsValid)
    {
        db.AddToMovies(newMovie);
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    else
    {
        return View(newMovie);
    }
}

La mia preoccupazione è passare un modello Movie al metodo Create che è popolato dai valori FORM "magicamente". Nella mia API, questo dovrebbe essere facilmente possibile e apparirebbe simile al routing:

var movie=router.Controller((context) => new MovieController(context))
                 .WithModel(() => new Movie());
movie.Handles("/movie/create").With((controller, model) => controller.Create(model));

La mia preoccupazione è che è molto più difficile avere più modelli a causa delle limitazioni con il sistema di tipi di C #. Ovviamente, il controller può sempre creare manualmente i modelli dai valori FORM e così via, ma non è altrettanto bello.

Quindi, la mia domanda: è comune avere qualcosa come Foo(Movie model) e Bar(SomeClass model) nella stessa classe controller? È una buona idea per me provare a supportare un tale scenario, o è solo un sintomo di mettere troppa logica non correlata in un singolo controller?

Nota: se sei preoccupato di come questa API fluente sia persino possibile, la risposta sono delegati generici .. un sacco di delegati generici :) (ma finora molto poca riflessione)

    
posta Earlz 01.03.2013 - 05:33
fonte

3 risposte

9

In breve No. Non penso che tu possa mai presumere che un controller utilizzerà sempre un solo modello primario.

La maggior parte delle applicazioni MVC finirà con un sacco di diversi modelli che vengono utilizzati dappertutto.

Usando il tuo esempio di film, se hai solo bisogno di usare un paio di elementi fuori dal tuo modello di film, probabilmente creerai un modello di visualizzazione più piccolo che è stato mappato dal modello di vista principale in quanto sarà più veloce e utilizzerà meno risorse.

Se stai utilizzando Entity Framework, questo può essere facilmente ottenuto ignorando la configurazione di AutoMapper.

Spero che questo aiuti un po '.

    
risposta data 01.03.2013 - 10:00
fonte
2

Questo non risponde direttamente alla domanda nel titolo, ma potrebbe darti spunti di riflessione.

Lo snippet che hai lì assomiglia a MVC3. In MVC3 c'è un'importante distinzione tra dominio / database / modelli di applicazione e modelli di visualizzazione. Mentre il controllore può utilizzare molti modelli di dominio per elaborare le richieste (creare viste, inviare elementi al db e quant'altro), può solo associare un modello di vista a una vista e tale vista può solo inviare un modello di vista sul postback. Pertanto, l'invio di più modelli di dominio all'azione implicherebbe in realtà un modello di visualizzazione intermedio che si collegherebbe alla vista e avrebbe riferimenti ai modelli di dominio.

Secondo me, la cosa che la maggior parte delle esercitazioni più semplici sbagliano è che usano il modello di dominio come modello di visualizzazione, che va bene per conto proprio, ma credo che qui ci sia una distinzione concettuale che deve essere notata .

Quando lavori con maschere / viste complesse in MVC3, più spesso non hai bisogno di modelli di vista separati che saranno composti da più modelli di dominio e / o appiattisci parte del grafico degli oggetti di dominio per semplificare le rappresentazioni in la visualizzazione e la gestione dei valori postali. Anche in questo caso, alcuni moduli più complessi ti consentono di recuperare i singoli valori dei post, sia dalla richiesta stessa sia impostando un altro parametro di azione con il nome del campo del modulo previsto.

    
risposta data 01.03.2013 - 10:59
fonte
0

Earlz, a mio modesto parere, penso che un controllore debba controllare una sottosezione del tuo progetto, diciamo il sistema di messaggistica o nel tuo caso il dominio del film. Quindi in sostanza non penso che sia sbagliato usare i diversi modelli richiesti per raggiungere il tuo obiettivo in un controller. Inoltre, puoi usare il tuo modello di dominio senza sottoclassare come il codice di un framework di entità che i primi sviluppatori fanno. Quindi la cosa più importante è che pianifichi i tuoi controller in modo che tutti i metodi di azione in esso eseguano un set di funzioni correlate.

    
risposta data 04.03.2013 - 23:38
fonte

Leggi altre domande sui tag