Perché utilizzare le route nominate per generare URL in uscita è una violazione di Separation of Concerns?

6

link

In computer science, separation of concerns (SoC) is the process of breaking a computer program into distinct features that overlap in functionality as little as possible. A concern is any piece of interest or focus in a program. Typically, concerns are synonymous with features or behaviors. Progress towards SoC is traditionally achieved through modularity and encapsulation, with the help of information hiding.

Dal libro Pro Asp.Net MVC 4 (pagina 375):

The problem with relying on route names to generate outgoing URLs ( @Html.RouteLink("Click me", "MyOtherRoute","Index", "Customer") is that doing so breaks through the separation of concerns that is so central to the MVC design pattern. When generating a link or a URL in a view or action method, we want to focus on the action and controller that the user will be directed to, not the format of the URL that will be used. By bringing knowledge of the different routes into the views or controllers, we are creating dependencies that we would prefer to avoid.

a) Capisco che creiamo una dipendenza (tra metodo di azione / visualizzazione e un modulo di configurazione di routing ) avendo Html.RouteLink (chiamato all'interno di metodo di azione o vista ) che specifica il nome della rotta che vogliamo usare.

Ma l'introduzione di una simile dipendenza ha già considerato una violazione di SoC ? Vale a dire, anche se abbiamo creato una dipendenza tra i due moduli , in realtà non abbiamo introdotto alcuna funzionalità / preoccupazione aggiuntiva in nessuno dei moduli (la definizione di SoC implica che violazione di SoC si verifica quando nuova funzionalità / preoccupazione viene introdotta in un modulo )

b) Comunque, non capisco come semplicemente generando un URL (all'interno di metodo di azione / vista ) specificando una named route porti l'attenzione su formato dell'URL ?

Grazie

    
posta user702769 25.03.2013 - 19:32
fonte

2 risposte

6

Penso che ciò che il libro MVC Pro ASP.NET significa sia che, facendo riferimento a una rotta per nome, ora hai creato una dipendenza da una particolare definizione di rotta, piuttosto che affidarti strettamente all'azione e al controller che verrà chiamato.

Il percorso è ciò che determina la forma dell'URL. Se crei un link utilizzando il nome di una route, stai letteralmente dicendo "Voglio che l'URL sia questa forma", piuttosto che dire "Voglio che l'URL invochi questa funzionalità" e lasciare che il motore di rotta decida quale percorso sia più appropriato .

Indipendentemente dal fatto che ciò abbia senso nella tua particolare applicazione dipende in ultima analisi dalle tue esigenze. L'utilizzo di una rotta denominata crea un livello di riferimento indiretto che consente di modificare sia la forma dell'URL, sia il controller / metodo che viene chiamato, semplicemente cambiando la voce nella tabella del percorso.

Per quanto riguarda l'aspetto dell'accoppiamento, l'uso di una rotta denominata fa strettamente accoppiare i collegamenti a quella rotta specifica perché nessun'altra rotta sarebbe idonea e perché richiede la vista per avere conoscenza di quella rotta specifica. Se questo è un problema o no, di nuovo, dipende dalle tue esigenze. Se quell'accoppiamento è una caratteristica desiderabile, non importa se è "stretto" o meno secondo l'opinione di qualcun altro.

    
risposta data 25.03.2013 - 23:51
fonte
3

Non viola il principio SOC; l'autore è sbagliato.

Le rotte con nome tipicamente incapsulano il controller e l'azione URL, che libera la vista dal doverli conoscere. Usato in questo modo in realtà promuovere la separazione delle preoccupazioni dal momento che la visione è libera dal conoscere il nome del controller e azione.

Ecco un esempio:

routes.MapRoute(name: "SignUpPromotion", 
                url: "some/url", 
                new { controller = "SignUp", action= "Promotion" });

Usando Html.RouteLink("SignUpPromotion") , ho liberato la vista dal doverlo sapere i nomi del controller e dell'azione. Potrei rinominare l'azione o anche spostarla a un nuovo controller senza influire sulla vista o modificando l'URL.

    
risposta data 10.04.2013 - 09:35
fonte