asp.net - microsoft - c# asp net mvc tutorial



Gestione di controller e percorsi singolari e plurali (3)

Risposta

Ecco una question posta nei programmatori StackExchange che suggerisce di mantenere singolari i nomi delle classi. Mi piace in particolare la logica di una delle risposte: "Lo strumento per girare le viti è chiamato" cacciavite "e non" cacciavite "." Che sono d'accordo. I nomi dovrebbero essere tenuti a nomi e aggettivi.

Per quanto riguarda il routing, le migliori pratiche sembrano favorire il fatto che i percorsi siano nomi pluralizzati e evitare l'uso di verbi. Questo blog Apigee dice: "Evita un modello misto in cui usi singolare per alcune risorse, al plurale per altri. Essere coerenti consente agli sviluppatori di prevedere e indovinare il metodo chiama mentre imparano a lavorare con la tua API." e suggerisce di usare singolare o plurale basandosi su ciò che i siti web popolari hanno fatto. Il loro unico esempio per l'utilizzo di nomi singolari nel percorso è il sito Zappos, che ha http://www.zappos.com/Product come percorso; ma se si esamina il sito, non è esattamente un percorso per una risorsa di prodotto , ma è invece una query, probabilmente per tutti i loro prodotti. Puoi inserire http://www.zappos.com/anything e ottenere una pagina dei risultati. Quindi non metterei troppa roba in quello.

Altri blog come this di mwaysolutions (random find) dicono "usa nomi ma non verbi" e "usa nomi plurali" . Altri punti a parte, la maggior parte dei blog / articoli tendono a dire la stessa cosa. Nomi plurali e nessun verbo.

TL; DR: usa nomi singolari per controller e nomi plurali per percorsi.

Controller

I controller e le rotte rappresentano due concetti diversi. Il controller è una classe o un progetto. Simile a uno stamper, non direi che ho un UnicornsStamper Direi che ho un UnicornStamper che fa il timbro di un unicorno con cui potrei creare una collezione di francobolli di unicorno. Le raccolte, i tipi Enum che sono campi bit, la classe statica che è una raccolta di proprietà (si comporta come una raccolta) e probabilmente alcuni altri casi limite sono dove utilizzerei un nome plurale.

Itinerari

Un (n) URL è un indirizzo di una risorsa, quindi il nome Uniform Resource Locator . Non sono d'accordo sul fatto che "una rotta è una domanda" . Le rotte possono contenere query ( stringa di query ) per restringere le risorse restituite, ma la rotta è la posizione o la / e risorsa / e che viene richiesta.

Con l'avvento del routing degli attributi, pluralizzare i percorsi per i controllori è facile come aggiungere un [RoutePrefix("quotes")] alla dichiarazione di QuoteController . Ciò consente anche una progettazione più semplice per i percorsi associativi. Osservando i percorsi di esempio forniti nella domanda originale:

/quotes GET: Gets all quotes POST: Creates a new quote /authors/shakespeare/quotes Associative route in the QuoteController GET: Gets all Shakespeare quotes /quotes/new This is a bad route IMO. Avoid verbs. Make a POST request to '/api/quotes' to create a new quote /quotes/shakespeare /quotes/popular Although these would be nice to have, they're not practical for routing (see below)

Il problema con le ultime due rotte è che non esiste un modo semplice per differenziare tra citazioni popolari e citazioni di autori, per non parlare di percorsi che si collegano a virgolette per nome o Id. Avresti bisogno di azioni decorate con [Route("popular")] seguito da [Route("{author}")] (in quest'ordine) in modo che la tabella di routing possa selezionare le rotte nell'ordine appropriato. Ma il percorso dell'autore uccide la possibilità di avere percorsi [Route("{quoteName}")] o [Route("{quoteId}")] (assumendo quoteId è una stringa). Naturalmente, vorrai avere la possibilità di indirizzarti alle quotazioni per nome e / o ID.

Argomento leggermente off

Ottenere le virgolette per autore sarebbe meglio farlo con un percorso associativo. Probabilmente si potrebbe ancora cavarsela con la rotta popolare come nome di una route statica, ma a questo punto si sta aumentando la complessità della rotta che sarebbe più adatta per una stringa di query. In cima alla mia testa, questo è il modo in cui potrei progettare questi percorsi se volessi davvero avere il termine di ricerca popolare nella route:

a:/authors/{authorName}/quotes b:/authors/{authorName}/quotes/popular c:/authors/{authorName}/quotes?popular=true d:/quotes/popular e:/quotes/popular?author={authorName} f:/quotes?author={authorName}&popular=true g:/quotes/{quoteName|quoteId}

Questi potrebbero essere distribuiti attraverso le azioni di QuoteController . Supponendo che il controller abbia un [RoutePrefix("quotes")] :

[HttpGet] [Route("popular")] [Route("~/authors/{authorName}/quotes/popular")] // Handles routes b, d, & e public ViewResult GetPopularQuotes(string authorName) return GetQuotes(authorName, true); [HttpGet] [Route("")] [Route("~/authors/{authorName}/quotes") // Handles routes a, c, & f public ViewResult GetQuotes(string authorName, bool popular = false) // TODO: Write logic to get quotes filtered by authorName (if provided) // If popular flag, only include popular quotes [HttpGet] [Route("{quoteId}")] // Handles route g public ViewResult GetQuoteById(string quoteId) // TODO: Write logic to get a single quote by ID

Disclaimer: Ho scritto questi attributi in cima alla mia testa, potrebbero esserci piccole discrepanze che dovrebbero essere risolte, ma si spera che l'essenza di come queste rotte funzionino.

Si spera che questo aiuti a chiarire una certa confusione sull'argomento del controller e sulle migliori pratiche di routing sulle convenzioni di denominazione. In definitiva, la decisione di utilizzare controller o percorsi plurali o singolari spetta allo sviluppatore. Indipendentemente da ciò, sii coerente una volta che scegli una best practice da seguire.

Sono un po 'confuso su come dovrei gestire percorsi e controller singolari e plurali nella mia applicazione web.

Il sito web è un sito di citazioni semplici - pensa ad Einstein, Shakespeare, ecc. All'interno del progetto ho un controller chiamato "QuoteController". Il nome del controller è singolare, quindi questo significa che il controller deve gestire solo la visualizzazione delle virgolette singole? IE

/quote/love-is-a-battlefield-1

Ho quindi bisogno di un altro controller per la visualizzazione di più quotazioni (plurale)? Per esempio:

/quotes/ (would default to most recent)
/quotes/new
/quotes/shakespeare
/quotes/popular

È convenzione, o buona pratica, avere controller separati per percorsi singolari e plurali? Spero che abbia un senso.


Buona domanda. Alcuni contributori a questo sito ti consiglierebbero di provare il sito Web di Programmers , ma sono disposto a tentare una risposta alla tua domanda.

Il meccanismo di instradamento in ASP.NET MVC, concettualmente, si basa sull'architettura orientata alle risorse ; la linea guida comune in ROA è

Le applicazioni dovrebbero esporre molti URI (possibilmente un numero infinito di essi), uno per ogni risorsa (qualsiasi risorsa nelle tue applicazioni dovrebbe essere accessibile in modo non ambiguo tramite un URI univoco)

Quindi, sta a te decidere se quote e quotes sono due risorse diverse o meno.


Solo perché i controller predefiniti di asp-mvc hanno nomi singolari, ciò non significa che dovresti implementare un modulo singolare per tutti i tuoi controller.

La risposta corretta è: dipende dalla quantità dell'entità rappresentata dal controller.

Singolare , l'esempio AccountController è singolare perché rappresenta azioni (metodo di azione) relative a un solo account.

Plurale Se il controller contiene almeno un metodo di azione che gestisce più entità in una singola transazione.

Esempio di formato plurale

users/update/3

La rotta sopra ti fa pensare che stai modificando tutti gli utenti, il che non ha senso se lo leggi come una frase. Tuttavia, se leggi la tua rotta come una query, avrà molto più senso.

Se ci pensiamo, una route è una query: {entities}/{action}/{parameter} sembra una query.

users/ stenografia di users/all "seleziona la tabella di tutti gli utenti"

users/123 legge "seleziona singola entità dalla tabella utenti"

users/update/123 legge "aggiorna la singola entità dalla tabella degli utenti"

I siti principali utilizzano il formato plurale , vedere l'esempio di seguito

.com/questions          <- list of questions   (multiple)
.com/questions/18570158 <- individual question (single)
.com/questions/ask      <- new question        (single)

.com/users        <- display list of users (multple)
.com/users/114403 <- individual user       (single)

asp.net/mvc/tutorials        <- display list of tutorials (multiple) 
asp.net/mvc/tutorials/mvc-5  <- individual tutorial       (single)

facebook.com/messages/     <- Display list of messages (multiple)
facebook.com/messages/new  <- Create a single message  (single)
facebook.com/messages/john <- view individual messages (multiple)

Credo che la grammatica inglese debba essere strettamente integrata in ogni aspetto della programmazione. Si legge in modo più naturale e porta a una buona igiene del codice.





asp.net-mvc-4