Ho una classe, che assomiglia a questa:
public class Customer
{
private readonly IList<Order> _orders = new List<Order>();
public FirstName FirstName { get; set; }
public LastName LastName { get; set; }
public Province Province { get; set; }
public IEnumerable<Order> Orders
{
get { foreach (var order in _orders) yield return order; }
}
internal void AddOrder(Order order)
{
_orders.Add(order);
}
//Planning to add an AddRange method to add a collection of Orders.
}
Qualcuno mi ha suggerito di recente che dovrei usare un Set invece di un elenco in quanto non ho bisogno dei vantaggi dell'indice di un elenco poiché è esposto come IEnumberable.
Se lo cambio in un set, come implego l'uguaglianza? Credo di avere alcune opzioni:
1) Lascialo come elenco.
2) Non fare nulla - quindi credo che gli ordini siano unici in base all'uguaglianza referenziale. C'è qualche rischio farlo? Ovunque leggo mi dice che è necessario eseguire l'override di Hashcode e equivale a se si sta utilizzando un Hashset. Ecco un esempio di un Set, in cui l'oggetto Object.hashcode e object.equals di default sembrano essere usati con un HashSet: link
3) Sostituisci .equals e .hashcode nella classe Order in modo che gli Ordini siano uguali se hanno lo stesso ID. Questo link suggerisce che non dovresti farlo: link
4) Creare una classe base Entity simile a questa: link . Il video di YouTube nel punto tre sembra sconsigliarlo.
5) Implementare unCompetitore IEquality. La ricerca che ho fatto suggerisce che questa è una cattiva idea perché: 1) Dovrò iniettare / passare un comparatore nell'entità e 2) Il codice per stabilire se due ordini sono uguali è in una classe diversa da Ordine che rende il modello di dominio anemica.
Sto cercando di seguire il principio del minimo stupore e mi ritrovo a girare in tondo a volte cercando di raggiungere questo obiettivo. Molti dei link qui sopra hanno diversi anni. C'è un modo standard per affrontare questo?