Se MVC è "Separazione delle preoccupazioni", allora perché è stata introdotta la sintassi del rasoio?

22

La mia domanda è correlata al modello di progettazione MVC e alla sintassi del rasoio introdotta da Microsoft.

Durante l'apprendimento del modello di progettazione MVC mi è stato detto che l'idea si basa su un principio noto come Separazione delle preoccupazioni .

Ma Razor Syntax ci consente di utilizzare C # in Views direttamente.

Non è questa intersezione di preoccupazioni?

    
posta John Strowsky 29.12.2014 - 10:53
fonte

4 risposte

66

Stai confondendo la sintassi del rasoio con la separazione delle preoccupazioni.

La separazione delle preoccupazioni ha a che fare con la struttura del codice.

Essere in grado di usare C # nelle viste non lo impedisce. nulla ha a che fare con la separazione delle preoccupazioni in quanto tale.

Certo, puoi strutturare il codice nella tua vista per non rispettare la separazione dei dubbi, ma per quanto riguarda il codice C # che viene utilizzato solo a scopo di visualizzazione? Dove potrebbe vivere?

    
risposta data 29.12.2014 - 10:59
fonte
35

Piuttosto che rispondere direttamente alla domanda, la mia risposta mette in dubbio l'assunto espresso nella domanda. Cioè, il presupposto che Razor sia stato costruito per MVC è errato. Lavoro con Microsoft nel team di ASP.NET e ho conoscenza diretta di questo.

Il rasoio non è stato avviato come motore di visualizzazione per MVC. È stato creato per Pagine Web ASP.NET , che è probabilmente il più lontano possibile verso le preoccupazioni meno separate lato dello spettro. È stato creato come alternativa moderna a ASP.NET Web Forms / Classic ASP e, naturalmente, a molti altri framework di programmazione server simili. L'idea di Razor era di creare transizioni quasi perfette tra HTML (markup) e C # (codice).

Solo in seguito il team (che include me stesso) deciderà che la sintassi del Rasoio avrebbe molto senso per il motore di visualizzazione di MVC, che veniva scritto dallo stesso team.

A prescindere dal fatto che Razor abiliti, ostacoli, migliori o altera il concetto di separazione delle preoccupazioni in ASP.NET MVC, Oded's la risposta è azzeccata.

    
risposta data 29.12.2014 - 17:57
fonte
9

Stai confondendo "separazione delle tecnologie" con "separazione delle preoccupazioni". L'idea alla base della porzione "Visualizzazione" di MVC è che il codice nella "Vista" non sta eseguendo direttamente alcun accesso ai dati o logica pesante, piuttosto che è lasciato alle porzioni "Modello" e "Controller" rispettivamente. Il "Controller" trasforma i dati, esegue qualsiasi logica necessaria e li indirizza alla "Vista" corretta. La vista può anche fare trasformazioni di dati, ma io tendo a mantenerle puramente estetiche, come la trasformazione della data di cui sopra.

    
risposta data 29.12.2014 - 21:52
fonte
0

Posso pensare a un perfetto esempio di Don't do it .

Diciamo che abbiamo un ProductController:

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.Where(x => x.Discontinued).ToList();
        return new ViewResult(products);
    }
}

Con il rasoio abbiamo un'alternativa

public class ProductController()
{
    public ViewResult Discontinued()
    {
        var db = new ProductsDb();
        var products = db.Products.ToList();
        return new ViewResult(products);
    }
}

e a nostro avviso:

@model IEnumerable<Product> 

@foreach (var item in Model.Where(x => x.Discontinued)) {
    ....
}

Penso sia abbastanza ovvio che la seconda soluzione sia così sbagliata. Se fai qualcosa del genere, non dare la colpa al rasoio - incolpati.

E non dimenticare: essere in grado di usare C # nelle viste non è una caratteristica del rasoio, era possibile anche con le viste ASP.NET. Con il rasoio è solo un po 'più semplice.

Se stai cercando un motore di template che sia più simile ai binari, dovresti dare un'occhiata a nancy.fx con il motore di visualizzazione Super semplice.

    
risposta data 30.12.2014 - 10:59
fonte

Leggi altre domande sui tag