Ho una chiamata RESTful che può modificare lo stato di un'istanza. Il mio problema è che il JSON è diverso in base al tipo di azione che l'utente sta prendendo, potrebbe essere un'azione SetProperty
o un'azione SetState
(tra gli altri).
Ad esempio, un POST /api/sample/
_would invia il seguente JSON
{
instanceId: 12312,
actionId: 12345, // Maps to a SetState action
desiredState: 'CURATION'
}
Ma quando si chiama lo stesso URL per un SetProperty , il JSON sarà simile a
{
instanceId: 12312,
actionId: 25354, // Maps to a SetProperty action
propName: "PropA",
propValue: "user-input"
}
Uso il seguente contratto di dati
[DataContract]
class PostInstanceRequest {
[DataMember]
int instanceId;
[DataMember]
int actionId;
[DataMember]
string desiredState; // Only used for SetState
[DataMember]
string propName; // Only used for SetProperty
[DataMember]
string propValue; // Only used for SetProperty
// Many more action specific properties here...
}
Non mi piace molto perché sembra che dovrei avere una classe base per le proprietà comuni e quindi dovrei definire più classi base con le proprietà specifiche.
-
SetStatePostInstanceRequest
, che aggiungedesiredState
-
SetPropertyPostInstanceRequest
, che aggiungepropName
epropValue
Tuttavia, se lo faccio, non so in che classe deserializzare. Dovrei prima deserializzare come PostInstanceRequest
, controllare la proprietà actionId
e poi deserializzare nella sottoclasse corretta.
Un possibile compromesso è usare la composizione
[DataContract]
class SetStateAction {
[DataMember]
string desiredState;
}
[DataContract]
class SetPropAction {
[DataMember]
string propName;
[DataMember]
string propValue;
}
[DataContract]
class PostInstanceRequest {
[DataMember]
int instanceId;
[DataMember]
int actionId;
[DataMember]
SetPropAction setPropParams;
[DataMember]
SetStateAction setActionParams;
// More references to action specific classes down here
}
Quale delle opzioni mi causerà meno problemi? O c'è un modo ancora migliore a cui non ho pensato?