2014-04-11 19 views
5

Sto utilizzando Web API v2 e ho una manciata di modelli per i quali devo eseguire operazioni CRUD. Ad esempio, ho un modello Allergy e un modello Prescription. Nell'applicazione stessa ho dei modelli che possono essere trasformati nei loro modelli appropriati, ma per semplicità diciamo che prendo il modello direttamente nel controller dell'API Web.Controller API Web generico

Quindi qualcosa di simile:

public class PrescriptionsController 
    { 
     public HttpResponseMessage Put(Prescription model) 
     { 
       // saved to the DB 
     } 

     ... (other CRUD operations) 
    } 

ho anche lo stesso per il modello Allergy:

public class AllergiesController 
    { 
     public HttpResponseMessage Put(Allergy model) 
     { 
       // saved to the DB 
     } 

     ... (other CRUD operations) 
    } 

Entrambi i modelli hanno proprietà diverse, ma vengono gestiti esattamente nello stesso modo - infatti ho circa altri 3 modelli che vengono gestiti esattamente allo stesso modo per ogni operazione CRUD. Detesto avere 5 diversi endpoint che sono fondamentalmente copiati e incollati.

Quindi la mia domanda è questa:

Posso fare un controller generico per gestire tutti questi modelli? Qualcosa come MyCommonController<T>? (ma con un nome migliore, ovviamente!) L'API Web può gestire il routing in tale scenario? E 'anche una buona idea?

+0

Penso che si possa ottenere questo in modo diverso .. tramite il routing. Non ho provato, ma vedrò. – Guanxi

+0

Sembra possibile. Ecco una discussione a riguardo: http://stackoverflow.com/questions/12077361/generic-webapi-controller – Trisk

risposta

7

Alla fine non ho provato un controller generico. Sembra che potrebbe essere possibile saltando attraverso alcuni cerchi con routing.

Tuttavia, il fatto che le modifiche al routing per far funzionare tutto questo era così complicato che ha negato il vantaggio che otterrei. Volevo mantenere le cose semplici. Così ho appena creato una classe di base generico invece:

class MyBaseController<TModel> : ApiController 
{ 
    public TModel Get(int id) { ... } 
} 

e aveva ogni tipo di ereditare da essa:

class PrescriptionsController : MyBaseController<Prescription> { } 

e che ha funzionato come fascino, non ha avuto a pasticciare con il routing o niente. Rende chiaro cosa sta succedendo ed è abbastanza mantenibile.

Problemi correlati