Controller di grandi dimensioni in Web API ASP.NET, Come organizzare

2

Ho un grande progetto WebApi con alcune dozzine di controller. Ogni controller rappresenta un prefisso endpoint, proprio come farebbe un normale progetto MVC. Ad esempio:

CarsController.cs rappresenta http://api.example.com/api/Cars

Nell'esempio precedente, il primo ruolo di quel controller è di fornire azioni CRUD per l'entità Car . A mano a mano che l'applicazione è cresciuta, scopriamo che per un'auto con un dato ID, potremmo voler operare su AccidentHistory come tale:

http://api.example.com/api/Cars/77/AccidentHistory

Ora, questo endpoint funge da azioni CRUD per la cronologia degli incidenti di auto con ID 77. Può andare avanti per qualsiasi numero arbitrario di livelli. La gerarchia degli endpoint REST è ottima, tutti la amano. Ma questo pone un problema nel mondo del routing basato su MVC. Ci piace avere un [Entity]Controller.cs per ogni entità di primo livello. Ogni entità discendente deve quindi risiedere nel file del controllore del più grande antenato. Finora, abbiamo assegnato a ciascuna entità discendente il proprio #Region in Visual Studio, ma non sembra una buona soluzione.

La mia prima idea era quella di spostare le azioni di ciascuna sub-entità in una classe parziale. Ad esempio:

CarsController.AccidentHistory.cs conterrà le azioni per l'endpoint dell'esempio precedente.

Questa sembra una buona idea, ma ci sono molte persone nella comunità che credono che l'uso di classi parziali sia un enorme odore di codice, e sono pronti a sottolineare che i partial sono stati implementati come un work-around per classi WinForms che erano generato automaticamente, ma deve essere modificato dallo sviluppatore.

Un altro chiodo nella bara della classe parziale, almeno per me, è che stiamo usando CodeDom per generare metodi TypeScript per ogni endpoint di primo livello, quindi c'è una classe in TypeScript che può essere usata per accedere a tutte le azioni per un dato endpoint. Con l'approccio di classe parziale, ci sono grossi problemi nel far sì che la generazione faccia ciò che vogliamo. (Visto che tutti i partial appaiono come la loro piena implementazione, si ottengono definizioni di classi duplicate generate in più file.

Quindi, c'è un modo migliore per organizzare il codice del controller per le rotte API RESTful in WebApi? Uno in cui possiamo sapere rapidamente dove si basa il codice per un determinato endpoint semplicemente su URL e metodo? Senza avere un controller per entità? Pensieri?

    
posta Ron Brogan 13.09.2016 - 03:55
fonte

1 risposta

1

Uno dei vantaggi del modello di routing in web api è che consente di separare completamente l'organizzazione della struttura URI dal layout del codice sottostante. Tutto ciò che sta facendo il motore di routing è decidere quale metodo eseguire in base a determinati criteri (in genere l'URI / stringa di query).

Dato questo, resisterei alla tentazione di permettere che la struttura del codice fosse decisa dal tuo schema URI. Nella mia esperienza uno dei migliori test per come organizzare il codice è "le cose che cambiano insieme dovrebbero vivere insieme", cioè, se un gruppo di classi tende a cambiare insieme per lo sviluppo di una determinata caratteristica, dovrebbero essere tutte sotto lo stesso genitore organizzativo (spazio dei nomi, di solito). Non so quanto maturo sia il tuo codice base esistente, ma può essere difficile determinarlo senza un sacco di codice / codice esistente da esaminare.

Nel tuo caso particolare, AccidentHistory suona come un dominio completamente diverso a Car , io lo sposterei da sotto la struttura di organizzazione dell'auto.

    
risposta data 23.03.2018 - 10:26
fonte

Leggi altre domande sui tag