2010-02-23 2 views
2

J'ai beaucoup lu sur l'implémentation du modèle de référentiel et je n'arrive toujours pas à savoir comment mettre en œuvre l'interrogation des projections d'entités.Une autre question de modèle de dépôt: comment gérer les projections de modèles de domaine?

Par exemple, j'ai une entité de produit grande et complexe, mais je veux afficher uniquement le nom du produit et son identifiant. Où devrais-je mettre en œuvre cette projection? Dans mon référentiel d'entités ou dans un code d'appelant?

Répondre

0

Je le fais dans le référentiel.

Par exemple, mon interface ProductRepository ressemblerait à ceci:

interface IProductRepository 
{ 
    Product Get(int productId); 

    void Save(Product product); 

    ProductView FindProducts(string productNameSearch); 
} 

ProductView est une représentation simplifiée de Product. (Ne contenant que le nom et l'identifiant par exemple).

La projection pour obtenir un ProductView, est quelque chose qui doit être abstrait, et le référentiel est un bon endroit pour cela, à mon humble avis.

+2

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é? –

0

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?

+0

P.S .: Dans les projets du monde réel, je préfère utiliser des trouveurs génériques avec des spécifications, mais ma mise en œuvre complète de cette notion serait trop distrayante ici. – chris

+0

P.P.S .: Je suis bien sûr conscient qu'il s'agit d'une solution spécifique au C#. Je ne sais pas si quelque chose d'équivalent est faisable en Java sans être trop lourd, car il ne supporte pas encore directement la notion de fonctions de première classe, etc. – chris

Questions connexes