Ho queste classi:
public class Order
{
private Lazy<IEnumerable<Volume>> _volumes;
long ID { get; private set; }
string Description { get; private set; }
IEnumerable<Volume> Volumes { get { return _volumes.Value; } }
//etc..
}
public class Volume
{
long ID { get; private set; }
string Description { get; private set; }
//etc..
}
Ho bisogno di istanziare e popolare più ordini. Per fornire gli oggetti di queste classi ho questi repository:
public interface IOrderRepository
{
Order GetByID(long ID);
IEnumerable<Order> GetAll();
Order Create(long ID, string Description);
void Update(Order O);
void Delete(Order O);
}
public interface IVolumeRepository
{
Volume GetByID(long ID);
IEnumerable<Volume> GetAll(Order O);
Volume Create(long ID, string Description, Order O);
void Update(Volume V);
void Delete(Volume V);
}
Non ho bisogno di compilare i volumi di ciascun ordine al momento dell'istanziazione, sarebbe meglio implementare il caricamento lento, secondo me, poiché possono esserci molti volumi.
Quindi, come faccio a far sapere all'Ordine dove recuperare i volumi? Ho questo codice che popola l'ordine che viene istanziato:
//Interface
public interface IVolumeFetcher { IEnumerable<Volume> GetAll(Order O); }
//Order Constructor
public Order(long ID, string Description, IVolumeFetcher VF)
{
_volumes = new Lazy<IEnumerable<Volume>>(() => VF.GetAll(this));
}
Questo dà all'Ordine un riferimento al Deposito, non mi sembra una buona idea.
Potrei mantenere i volumi dell'ordine in una lista semplice e riempirla quando necessario:
public List<Volume> Volumes { get; private set; }
Ma questo approccio sarebbe facilmente corrotto, qualsiasi chiamante potrebbe aggiungere un volume alla lista e non sarebbe mantenuto nel DB. Btw, questa è un'applicazione a tre livelli, con una classe Order e Volume per ogni livello, oltre a un repository.