Ho avuto una discussione sulla standardizzazione delle strutture di ritorno in un'API e il modo migliore per applicarla ai nostri servizi. Il modo più rapido con cui abbiamo lavorato è stato quello di far sì che i nostri controller in .NET Web Api restituiscano la stessa classe di modelli, quindi abbiamo trovato qualcosa di simile
class ResponseObject<T>
{
public T Data {get;set;}
public Permissions UserPermissions {get;set;}
public Message ObjectMessage {get;set;}
public Status ObjectStatus {get;set;}
}
E ogni controller restituisce questo strcuture e riempie le proprietà comuni. Abbiamo anche creato alcune funzioni di supporto in modo che i controller che condividevano lo stesso tipo di ritorno T
non stessero riscrivendo le stesse cose più e più volte.
Questo funziona bene per la maggior parte, ma la mia idea è stata invece di fare in modo che ogni controller lo trasformasse in un filtro azione.
public class MyResponseHandler : ActionFilterAttribute
{
public override OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
var objectContext = actionExecutedContext.Response.Content as ObjectContent;
if(objectContent != null)
{
var val = objectContent.Value;
var type = objectContent.ObjectType;
actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(actionExecutedContext.Response.StatusCode,
new ResponseObject<type>(){data = val})
}
}
}
Per le altre proprietà nel comune ResponseObject
la mia idea era che queste potevano essere gestite con più filtri di azione nella pipeline per riempirli. Ho pensato che fosse un buon approccio perché gli sviluppatori dovevano solo preoccuparsi di restituendo l'oggetto di cui si preoccupavano veramente per il controller e quindi la pipeline gestiva tutto allo stesso modo per ogni tipo di oggetto. Alla fine abbiamo ritenuto eccessivo e ci sono stati alcuni timori che il gasdotto avrebbe avuto troppa logica e le decisioni prese in esso portando a un sacco di errori difficili da debug. Ma sono curioso di vedere quali altre persone hanno pensato a questo approccio o se qualcuno ha fatto qualcosa di simile ad applicare le strutture di ritorno in un'API.