Ho avuto qualche problema con un design che avrebbe alleviato la maggior parte, se non tutti, i problemi che ho incontrato, e mi chiedo se sia il mio design di base.
La nostra azienda accetta ordini. Accettiamo diversi tipi di ordini in base alla linea di prodotti a cui appartengono, ma tutti gli ordini condividono alcune funzionalità e proprietà. Il mio obiettivo è quello di iniettare qualsiasi ordine che implementa un'interfaccia specifica in una classe OrderRepository.
Per soddisfare queste esigenze, ho creato una classe OrderBase:
public class OrderBase {
public string order_number {get; set;}
public string order_type {get; set;}
public string order_date {get; set;}
public List<IOrderItem> order_items { get; set; }
public virtual bool Validate();
}
Ho creato un'interfaccia che simula la classe base in modo da poter utilizzare la classe base esattamente come quella ... la funzionalità di base per un ordine.
public interface IOrder {
string order_number {get; set;}
string order_type {get; set;}
string order_date {get; set;}
List<IOrderItem> order_items { get; set; }
bool Validate();
}
Un tipo di ordine è implementato come tale:
public class TXOrder : OrderBase, IOrder {
// Specific to TXOrder only
public bool isOnHold {get; set; }
public override bool Validate() {
// Enter TXOrder-specific validations here.
return base.Validate();
}
}
TXOrder eredita la classe base, ottenendo tutte le proprietà e i metodi e l'interfaccia implementata è soddisfatta dalle proprietà e dai metodi della classe base. Al momento funziona con ModelBinders che si associano all'oggetto corretto per i dati in arrivo.
Il repository ha questo aspetto:
interface IRepository<T, U>
where U : IParameters
{
T SelectSingle(long id);
List<T> Select(U parameters);
T Insert(T entity);
T Update(T entity);
T Delete(T entity);
}
public class OrderRepository: IRepository<IOrder, OrderParameters> {}
Se hai bisogno dei dettagli cruenti del OrderRepository, non esitare a chiedere. Accetta qualsiasi ordine che io possa lanciare di tipo IOrder. Questo è il punto chiave da portare via.
Questo è un modello che può continuare a funzionare a lungo termine mentre aggiungo funzionalità specifiche per ogni tipo di ordine? C'è un altro modello che posso guardare?