Lavoro in un sistema che può rappresentare una "stima di spedizione" in due modi:
- Una data specifica: l'articolo è garantito per la spedizione in tale data
- Intervallo di un giorno: l'articolo verrà spedito "da X a Y" giorni a partire da oggi
Le informazioni sul modello sono semanticamente uguali, è "la stima di spedizione". Quando ottengo le informazioni sulla stima di spedizione dal sistema, posso dire se la stima è della prima forma o della seconda forma.
Il modello attuale per questo è simile al seguente:
class EstimattedShippingDateDetails
{
DateTime? EstimattedShippingDate {get; set;}
Range? EstimattedShippingDayRange {get; set;}
}
Range
è una semplice classe per racchiudere un "inizio - > fine" di numeri interi, un po 'come questo:
struct Range
{
int Start {get; set}
int End {get; set}
public override ToString()
{
return String.Format("{0} - {1}", Start, End);
}
}
Non mi piace questo approccio perché solo una delle proprietà sul modello di stima sarà mai popolata, e ho bisogno di testare null su uno di essi e assumere che l'altro abbia i dati.
Ciascuna delle proprietà viene mostrata in modo diverso all'utente, ma nello stesso punto dell'interfaccia utente, utilizzando un MVC DisplayTemplate personalizzato, in cui risiede la logica di commutazione corrente:
@Model EstimattedShippingDateDetails
@if (Model.EstimattedShippingDate.HasValue)
{
Html.DisplayFor(m => Model.EstimattedShippingDate)
}
else
{
Html.DisplayFor(m => Model.EstimattedShippingDayRange)
}
Come potrei modellarlo per renderlo più rappresentativo del requisito reale, pur mantenendo la logica del display semplice in un'applicazione MVC?
Ho pensato di utilizzare un'interfaccia e due implementazioni, una per ogni "tipo" di stima, ma non riesco a spiegarmi come un'interfaccia comune per entrambi. Se creo un'interfaccia senza membri, quindi non posso accedere ai dati in modo unificato ed è un cattivo design IMHO. Volevo anche mantenere il viewmodel il più semplice possibile. Avrei comunque ottenuto un codice "corretto per costruzione" con questo approccio, poiché non ci sarebbe più bisogno di nullable: ogni implementazione avrebbe una proprietà non nullable, o DateTime
o Range
.
Ho anche considerato di utilizzare solo un Range
e quando si verifica la situazione # 1, usa lo stesso DateTime
per Start
e End
, ma ciò aggiungerebbe complicazioni su come emettere i valori sul L'interfaccia utente dovrebbe quindi rilevare se si tratta di un errore statico o di un intervallo confrontando i valori e formattare correttamente l'intervallo in modo che venga visualizzato come una singola data o un intervallo formattato.
Sembra che quello di cui ho bisogno è un concetto simile ai sindacati di Typescript: fondamentalmente una proprietà che può essere di due tipi. Nessuna cosa del genere esiste in modo nativo in C # ovviamente (solo dynamic
sarebbe vicino a quello).