2009-07-08 11 views

risposta

1

È molto probabile, ma non è necessario utilizzare un'interfaccia comune o eseguire molti casting. Utilizzando un'interfaccia ...

public interface IRepository 
{ 
    public object Get(int id); // or object id 
    public void Save(object obj); 
} 

public class CustomerRepository : IRepository 
{ 
    public object Get(int id) { // implementation } 
    public void Save(object obj) { // implementation } 
} 

Questo funziona bene, ma codice chiamante deve lanciare oggetti per il tipo corretto e metodi in implementazioni concrete devono verificare il tipo e generare eccezioni. Il casting diretto richiede eccezioni di runtime, quindi eviterei questo approccio.

L'approccio che raccomanderei è di non avere i repository che implementano un'interfaccia comune. Piuttosto, devono implementare metodi comunemente denominati per convenzione.

public class CustomerRepository 
{ 
    public Customer Get(int id) { // implementation } 
    public void Save(Customer entity) { // implementation } 
} 

public class EmployeeRepository 
{ 
    public Employee Get(int id) { // implementation } 
    public void Save(Employee entity) { // implementation } 
} 

A cura di aggiungere: ho riletto la risposta collegata. L'ultimo paragrafo completo mi perde, ma posso ampliare un po 'l'utilizzo di DI. Nella maggior parte dei casi non avrebbe senso usare DI per iniettare un repository "generico" (in questo caso derivato da un'interfaccia comune). Oltre ai metodi comuni, un repository avrà metodi specifici dell'entità come GetCustomersWithPastDueAccounts. È possibile definire un repository clienti IC con quel metodo e farlo implementare dal proprio repository clienti. Quindi è possibile utilizzare dependency injection per iniettare CustomerRepository in fase di runtime. Non c'è niente di sbagliato in questo, ma nella mia esperienza è abbastanza raro che tu abbia più implementazioni di un repository quindi non ha molto senso farlo.

+0

Ma con il tuo secondo approccio, non perdo la possibilità di iniettare dipendenze? –

+1

È sempre possibile eseguire l'iniezione manuale delle dipendenze. Ma hai ragione, non saresti in grado di usare un framework DI per fare un'iniezione di dipendenza. Modificherò la mia risposta e aggiungerò ulteriori spiegazioni. –

+0

Quindi, fondamentalmente, c'è un'interfaccia per ogni repository e che può essere usata per DI. Per 10 entità, 10 interfacce, con almeno 10 implementazioni. Suono giusto? –

0

a meno che non abbia letto male qualcosa, la risposta accettata nella domanda collegata non utilizza i generici. Sta definendo un'interfaccia e usando il termine "generico" significa che l'interfaccia non è legata direttamente a una tabella specifica nel modello.

+0

Non penso che sia il caso, ma se lo è, quali sarebbero le firme di quelle 7 funzioni in IEntityRepository? –

+1

Si riferisce all'implementazione del repository che utilizza l'interfaccia IRepository . –

Problemi correlati