(ho ristrutturato la risposta di affrontare meglio le domande nei commenti)
penso, l'attributo è qui solo per una migliore flessibilità. Come progettista di framework, si vuole rilassare il più possibile i limiti di codifica degli utenti finali. Il requisito di non avere non-azioni pubbliche può suonare "in generale", ma potrebbe essere troppo restrittivo per alcuni progetti.L'aggiunta di [NonAction]
risolve il problema (introdotto dal loro cattivo design) - e ovviamente non sei obbligato a usare l'attributo, quindi è un win-win dal punto di vista del progettista di framework.
Un altro motivo può essere legacy - nelle versioni MVC precedenti solo i metodi contrassegnati con [Action]
dove considerati come azioni. Quindi, quando hanno allentato il requisito (e tutti i metodi pubblici sono stati trattati come azioni) hanno mantenuto [NonAction]
in modo che gli sviluppatori non si confondessero troppo.
In generale, utilizzando NonAction
è una cattiva pratica - esattamente per le ragioni che lei ha affermato. Se qualcosa non dovrebbe essere un'azione, non dovrebbe essere public
in primo luogo.
problema con metodi non-azione pubblica sul controller è che fanno le persone tentati per istanziare il controller e chiamare il metodo, invece di separare la logica comune:
Confronta
public class MyController : IController
{
public ActionResult Foo(long orderId)
{
var order = new OrdersController().GetOrder(orderId); //GetOrder is public
...
}
}
con
Il primo approccio porta ad un aumento dell'accoppiamento tra controllori e codice non semplice nelle azioni. Il codice diventa difficile da seguire e refactoring e scomodo da simulare/testare.
Oltre all'accoppiamento aumentato, qualsiasi metodo di non azione pubblico è un buco di sicurezza - se si dimentica di contrassegnarlo con [NonAction]
(o, meglio, di allontanarsi dal pubblico) - perché viene trattato come azione normale e può essere richiamato esternamente. So che la domanda originale ti suggerisce che sicuramente non dimenticherai mai di allegare l'attributo, se necessario, ma è anche importante capire cosa può succedere se vuoi;) Oh beh, e visto che ci siamo, mi sembra che "dimenticare l'attributo" è più teoricamente probabile, rispetto al "dimenticare di rendere il metodo privato".
volte la gente dice che ha public
non-azioni è necessario per unit test, ma ancora una volta, quando qualcosa non è un'azione molto probabilmente può essere isolato in una classe separata e testato separatamente. Inoltre, pari a anche se non è fattibile per qualsiasi motivo, contrassegnare un metodo public
a scopo di prova solo è una cattiva abitudine - utilizzando internal
e InternalsVisibleTo
è il modo consigliato.
Non sei sicuro di quello che stai cercando - se hai un metodo che deve essere pubblico per qualche motivo ma non dovrebbe essere un'azione, lo segnalo in questo modo ... Oppure la tua domanda è "perché le persone usano metodi pubblici"? –
@AlexeiLevenkov: Sì, la mia domanda è: perché le persone usano il metodo public nonaction. possono persino usare il metodo privato. – ChandniShah