1) What do you do if you want to switch out ORMs, you would have
specific ORM code in your application if you do not contain it in a
repository.
Non sono ancora stato in una posizione in cui all'improvviso la società ha deciso di cambiare la tecnologia di accesso ai dati. Se questo dovesse accadere, sarà richiesto del lavoro. Tendo ad astrarre le operazioni di accesso ai dati attraverso le interfacce. Il repository è un modo per risolvere questo problema.
Avrei quindi un altro assembly per l'implementazione concreta del mio livello di accesso ai dati. Ad esempio, potrei avere:
Company.Product.Data
e Company.Product.Data.EntityFramework
assiemi. Il primo assembly sarebbe utilizzato esclusivamente per le interfacce, mentre un altro sarebbe una implementazione concreta della logica di accesso ai dati di Entity Framework.
2) Is the repository pattern still valid when not using an ORM and you
are using ADO.net for data access and populating object data yourself
?
Penso che dipenda da te decidere quale modello è valido o meno. Ho usato un modello di repository nel livello di presentazione. Una cosa da tenere a mente è che alle persone piace buttare responsabilità nei repository. Prima che tu lo sai, il tuo corso di repository ballerà, canterà e farà ogni sorta di cose. Vuoi evitare questo.
Ho visto una classe di repository iniziata con le responsabilità GetAll, GetById, Update ed Delete, che va bene. Quando il progetto fu completato, quella stessa classe aveva dozzine di metodi (responsabilità) che non avrebbero mai dovuto esserci. Ad esempio GetByForename, GetBySurname, UpdateWithExclusions e tutti i tipi di cose pazzesche.
È qui che entrano in gioco query e comandi.
3) If you use an ORM but not the repository pattern where do you keep
commonly used queries. Would it be wise to represent each query as a
class and have some sort of query factory to create instances ?
Penso che sia una buona idea usare query e comandi al posto dei repository. Faccio quanto segue:
-
Definisci l'interfaccia per una query. Questo ti aiuterà a testare l'unità. Per esempio. public interface IGetProductsByCategoryQuery { ... }
-
Definisci l'implementazione concreta per una query. Sarete in grado di iniettare questi attraverso la cornice IoC di vostra scelta. Per esempio. public class GetProductsByCategoryQuery : IGetProductsByCategoryQuery
Ora invece del repository inquinante con dozzine di responsabilità, raggruppo semplicemente le mie query in namespace. Ad esempio, un'interfaccia per la query sopra potrebbe vivere in: Company.SolutionName.Products.Queries
e l'implementazione potrebbe vivere in Company.SolutionName.Products.Queries.Implementation
Per quanto riguarda l'aggiornamento o la rimozione dei dati, utilizzo lo schema di comando nello stesso modo.
Alcuni potrebbero non essere d'accordo e dire che prima che il progetto sia completo, avrai dozzine di classi e spazi dei nomi. Sì lo farai. Nella mia mente è una buona cosa che puoi sfogliare la soluzione in IDE di tua scelta e vedere immediatamente che tipo di responsabilità ha un determinato componente. Se invece hai deciso di utilizzare un pattern di repository, dovrai cercare all'interno di ciascuna classe del repository cercando di risolverne le responsabilità.