Come rendere i membri del mio oggetto Data Access Layer consapevoli dei loro fratelli

0

Al momento il mio team ha un progetto con un oggetto di accesso ai dati così composto:

public abstract class DataProvider 
{
     public CustomerRepository CustomerRepo { get; private set; }
     public InvoiceRepository InvoiceRepo { get; private set; }
     public InventoryRepository InventoryRepo { get; private set; }
     // couple more like the above
}

Abbiamo classi non astratte che ereditano da DataProvider e il tipo di "CustomerRepo" che viene istanziato è controllato da quella classe figlio.

public class FloridaDataProvider 
{
     public FloridaDataProvider() 
     {
          CustomerRepo  = new FloridaCustomerRepo(); // derived from base CustomerRepository
          InvoiceRepo = new InvoiceRespository();
          InventoryRepo = new InventoryRepository();
     }
}

Il nostro problema è che alcuni dei metodi all'interno di un determinato repository trarrebbero vantaggio dall'avere accesso agli altri repository. Ad esempio, un metodo all'interno di InventoryRepository deve accedere ai dati del cliente per effettuare alcune determinazioni, quindi è necessario passare un riferimento a un oggetto CustomerRepository.

Qual è il modo migliore per questi repository "fratelli" di essere a conoscenza l'uno dell'altro e avere la capacità di chiamare i reciproci metodi come necessario? Praticamente tutti gli altri repository trarrebbero vantaggio dall'avere CustomerRepo, ad esempio, perché è da dove vengono selezionati nomi / telefoni / etc, e questi elementi di dati devono essere aggiunti ai vari oggetti che vengono restituiti dagli altri repository.

Non posso semplicemente creare un nuovo oggetto "CustomerRepository" all'interno di un metodo all'interno di un repository diverso, perché potrebbe non essere il CustomerRepository di base che deve effettivamente essere eseguito.

    
posta Graham 21.08.2014 - 21:53
fonte

1 risposta

1

Innanzitutto, lascia ignorare il fatto, che i repository sono stupido idea in primo luogo.

Like, a method inside InventoryRepository needs to get to Customer data to do some determinations

I tuoi repository sono ovviamente dei principi che infrangono il principio della singola responsabilità. Il fatto che il tuo repository stia estraendo dati dal DB e aggiungendo qualche comportamento su di esso è una chiara indicazione di ciò. Il modo per risolvere questo è semplice. Lascia la logica di caricamento dei dati nel repository e crea una classe separata per eseguire la logica aggiuntiva.

    
risposta data 22.08.2014 - 08:31
fonte

Leggi altre domande sui tag