Stavo cercando un'alternativa a Repository Pattern e ho letto su "Query object pattern" ( link ). Tuttavia, l'implementazione fornita nel link sopra non è esattamente ciò che stavo cercando: cerco qualcosa che possa essere facilmente iniettato, facilmente testato e facilmente estensibile / modificato (vale solo per l'ultimo punto nell'implementazione del collegamento). Ho pensato un po 'e penso "ho inventato" la soluzione. Supponiamo che abbia controller BlogEntriesController
(sto parlando di mvc asp
applicazione con ORM) e mi inietto alla classe di costruzione:
public class BlogEntriesQueries
{
IRetrieveQuery<BlogEntryEntity> PageBlogEntries { get; set; }
IRetrieveQuery<BlogEntryEntity> ProposedBlogEntries { get; set; }
IAddQuery<BlogEntryEntity> CreateNewBlogEntry { get; set; }
... etc..
}
dove IRetrieveQuery<T>
è smth come:
public interface IRetrieveQuery<TEntity> where TEntity : EntityBase
IQueryable<TEntity> CurrentQuery { get; }
IRetrieveQuery<TEntity> InvokeQuery(IRetrieveQuery<TEntity> subQuery);
IEnumerable<TEntity> GetQueryResults();
}
Quindi tutto il lavoro che dovrei fare è la corretta configurazione del contenitore IoC per iniettare query nel controller e le chiamate appropriate nel controller come: _blogQueries.ProposedBlogEntries.GetQueryResults()
La domanda è - è una buona soluzione - ci sono degli svantaggi che io indosso capisci? Penso che otterrei la testabilità (non ho nemmeno bisogno di simulare ISession
in caso di NHibernate
) e sarebbe facilmente estensibile, ma non sono un esperto (specialmente nelle applicazioni di database) con qualsiasi mezzo.