Domanda di implementazione .NET (accesso al repository)

1

Sto provando a scrivere un metodo generico che va a una particolare tabella DB a seconda dell'entità che viene passata (tutte le entità valide implementano IStaticData ):

IEnumerable<T> GetEnumerable<T>() where T : IStaticData

Sto usando il framework nop commerce e ho a mia disposizione IRepository<T> per ogni entità nel database, ad es. IRepository<User>

Non riesco a pensare a un modo migliore per scrivere ciò che "passare" al tipo di entità passata e utilizzare la relativa classe di repository - c'è un modo migliore!?

    
posta Ben Toomer 16.03.2016 - 18:20
fonte

1 risposta

3

Potresti usare una fabbrica astratta, come questa:

public interface IRepository<T> { }

public interface IRepositoryFactory
{
    IRepository<T> GetRepository<T>();
}

Questo lascia solo la domanda, qual è l'implementazione di IRepositoryFactory?

Stavo per descrivere Impianto di produzione tipizzato di Castle Windsor ma I Googled e nopCommerce utilizza un altro contenitore di iniezione delle dipendenze , autofac.

Non ho usato Autofac (il prossimo sulla mia lista) ma questi contenitori fanno essenzialmente la stessa cosa. Ecco un post stackoverflow che descrive la creazione di un abstract fabbrica con Autofac. La domanda sembra esattamente come il tuo scenario, e la prima risposta mostra una fabbrica che utilizza Autofac.

Se non l'hai già usato, mi dispiace, quello era un puntatore davvero maldestro per l'iniezione di dipendenza. Ma questo è esattamente il tipo di problema che affronta. Stai cercando di capire come creare la giusta classe per l'interfaccia giusta senza if / thens o switch. DI gestisce questo e altro.

Sono andato alla home page di Autofac e i campioni di codice proprio lì danno un'immagine davvero concisa di ciò che fa. Guarda solo i primi due. A sinistra mostra come gli dici quali classi usare per quali interfacce. Puoi nominarli uno alla volta o persino scansionare un assembly per le classi che implementano un'interfaccia.

    
risposta data 17.03.2016 - 04:37
fonte

Leggi altre domande sui tag