Je ręve le schéma suivant récemment:
interface IRepository
{
Product FindByName(string name);
ProjectionType FindByName<ProjectionType>(string name,
Expression<Func<Product, ProjectionType>> selector);
// ...
}
Avec ce modèle, vous pouvez par exemple spécifier des projections à la volée avec des expressions LINQ et les classes anonymes, comme ceci:
var productView = repository.FindByName("foo",
p => new { p.SomeProperty, p.SomeOtherProperty });
Ce que je pense est assez soigné. Avec NHibernate.Linq, une mise en œuvre pourrait ressembler à ceci:
ProjectionType FindByName<ProjectionType>(string name, Expression<Func<Product, ProjectionType>> selector)
{
using(var session = this.sessionFactory.OpenSession()) {
return session.Linq<Product>()
.Where(p => p.Name.Equals(name))
.Select(selector)
.SingleOrDefault();
}
}
AVERTISSEMENT: Méfiez-vous des bugs ou un mauvais style dans le code ci-dessus. Peut-être même pas compiler. C'est juste du bout de la tête. Mais je pense que l'idée devrait être assez claire.
Des pensées?
Mais ne pas briser le modèle référentiel de cette façon, car ce modèle est destiné à fournir un accès à des entités comme la collecte, non vues entité? –