2012-03-13 13 views
13

È possibile creare una classe parziale per il controller in MVC?Classe parziale per controller

Motivo: Possiedo un controller che contiene troppi codici. Questo controller contiene il codice per diversi report e, a causa del numero eccessivo di codice, riduce la leggibilità del codice. Voglio mantenere lo stesso nome del controller per tutti i report, quindi voglio distribuire il codice per i diversi report.

Se posso fare qualsiasi altro modo di farmi sapere.

Grazie Alok Shah

risposta

13

Sì, è possibile utilizzare una classe parziale - il compilatore semplicemente li unisce un tempo di compilazione per la produzione di uno.

Tuttavia, si dice di voler "distribuire" il codice: se il codice è destinato a più progetti, i partial non aiuteranno.

È invece possibile creare classi controller di base (che ereditano da System.Web.Mvc.Controller in un progetto di libreria di classi, con i metodi di azione necessarie, e poi semplicemente utilizzare il routing per indirizzare gli URL simile a diversi controller. Here's a link to the Asp.Net Tutorial 'Creating Custom Routes' che potrebbe essere utile per questo. Consiglio vivamente di esaminare il resto del tutorial se ci sono altri aspetti fondamentali di MVC di cui non sei sicuro. Non copre tutto, ma fa le basi

Un'applicazione Web che deve essere utilizzata quelli che poi hanno semplicemente i propri controllori ereditano da quelli ridistribuibili. Ancora meglio, ora puoi creare punti di estensibilità attraverso metodi virtuali ecc. se ci sono elementi di questi rapporti che le diverse app Web potrebbero dover personalizzare.

Così "Reports/Customers" poteva rotta verso un CustomerReportsController e "Reports/Orders" percorso possibile per una OrdersReportsController:

routes.MapRoute("CustReports", 
    "Reports/Customers/{action}", 
    new { controller = "CustomerReports", action = "Index", id = "" }); 

routes.MapRoute("OrderReports", 
    "Reports/Orders/{action}", 
    new { controller = "OrdersReports", action = "Index", id = "" }); 

Questo è l'approccio più semplice a questo problema - ma credo che usando Areas (link è quello di MSDN walkthrough) sarebbe più potrebbe anche essere applicabile, nel qual caso potresti non aver bisogno di utilizzare il routing perché la route predefinita probabilmente farebbe tutto.

+0

+1, buona idea !! –

+0

@Andras: Posso avere qualche codice di esempio o un link di riferimento per questo? Non ho mai fatto il routing personalizzato, quindi non ne ho idea. –

+0

@alok_dida hanno aggiornato. –

6

Naturalmente!

Le classi parziali sono una caratteristica del linguaggio C# e non presentano alcuna relazione con MVC o con qualsiasi altro framework che si sta utilizzando.

+0

.. Ciò significa che posso creare classi parziali anche per il Controller. Destra? –

+2

Questo è corretto :) –

0

Sì. Le classi parziali sono in realtà solo una caratteristica del linguaggio e la classe compilata è una normale classe .NET come qualsiasi altra.

vorrei suggerire però che di dividere il controller in più controller, per garantire una corretta separazione degli interessi (avere una classe che è così grande è necessario dividerlo in più file sarà sicuramente smell bad.)

0

" Se posso fare altro modo se non fatemi sapere"

ne dite:

  • astratta via il 'fare' le parti a vari generatori di report per i tipi di rapporti discreti, tutti conformi alla un'interfaccia . Questi generatori di report saranno le classi sedute al di fuori del livello MVC dell'applicazione.
  • Pulire il controller in modo che le dipendenze (generatori di report) vengano iniettate nel costruttore, utilizzando Ninject, StructureMap o Castle Windsor
  • Ripulire tutto il codice di generazione del report dal controller e nelle implementazioni concrete del report generatore di astrazioni

Non sarà quindi necessario suddividere i controller in classi separate. Il rovescio della medaglia è che ci vorrà un ragionevole lasso di tempo per concettualizzare e implementare, ma si finirà con una base di codice migliore.

+0

Non riesco a raggiungerti. Potete fornirci qualche codice di esempio o un'applicazione di esempio? –

+0

La difficoltà qui sta nel concettualizzare - Non posso davvero fornirti un'applicazione di esempio, ma posso indicarti una spiegazione decente e un esempio di molto di quello che ho descritto (anche in un linguaggio migliore) - http://www.mikesdotnetting.com/Article/117/Dependency-Injection-and-Inversion-of-Control-with-ASP.NET-MVC – SpaceBison

Problemi correlati