2

J'essaie de mapper un modèle de domaine dans NHibernate. Le modèle de domaine est implémenté avec ce que je pense être le style DDD. Le mappage fonctionne principalement, mais lorsque j'essaie d'utiliser un filtre de collection sur une collection, j'obtiens une exception qui dit: La collection n'a pas été référencée.Utilisation de filtres de collection NHibernate avec des collections DDD

Je sais que le problème vient de la façon dont j'ai implémenté la collection. Ma question: Est-il possible d'utiliser des filtres de collection dans nHibernate sur des collections implémentées de cette façon ou devrais-je simplement l'oublier, c'est-à-dire que nHibernate ne peut pas fonctionner avec cela.

Le code est le suivant:

Person 
{ 
    IList<Address> _addresses = new List<Address>(); 
    public string FirstName {get; set;} 
    ... 
    public void addAddress(Address address) 
    { 
     // ... do some checks or validation 
     _addresses.Add(address); 
    } 

    public void removeAddress(Address address) {...} 

    public ReadOnlyCollection<Address> Addresses 
    { 
     get { return new ReadOnlyCollection<Address>(_addresses); } 
    } 
} 

Le principal problème est que je ne veux pas exposer les adresses internes collection publique. Toutes les autres choses fonctionnent, j'utilise l'accès field.camelcase-underscore pour que nHibernate interagisse directement avec le champ. J'ai travaillé sur le livre Hibernate in Action, et maintenant je suis au chapitre 7 où il traite des filtres de collection.

Y a-t-il un moyen de contourner cela? Je l'ai pour travailler en exposant la collection interne comme ceci:

public ReadOnlyCollection<Address> Addresses 
{ 
    get { return _addresses; } 
} 

mais je ne veux vraiment pas faire cela.

L'aide serait vraiment appréciée.

Jide

Répondre

0

Si je me souviens bien - filtre NHibernate fonctionne comme clause supplémentaire dans les requêtes SQL pour réduire les lignes de retour db.

Ma question est de savoir pourquoi vous en avez besoin?
Je veux dire - combien d'adresses une personne pourrait avoir? 1? 5? dix?


A propos de l'isolement de collection ...

Je me suis simplement l'accepter comme un sacrifice pour NHibernate (juste comme cteur-moins l'argument et "virtual`ity") et de l'utilisation exposais IList partout (avec les organismes privés) juste pour réduire la complexité technique. Leur contenu peut certainement être modifié de l'extérieur, mais je ne fais pas cela.

Il est plus important de garder le code facilement compréhensible que de le rendre très sûr. La sécurité suivra.

+0

Si vous exposez un IList, comment gérez-vous le consommateur en modifiant directement la collection? Je crois comprendre qu'il est préférable de créer une méthode d'assistance pour que vous puissiez gérer la relation bidirectionnelle. –

+0

@Mike Je ne gère pas cela. C'est ce que je voulais dire par le sacrifice. Je fais juste la convention pour ne pas faire ça. Peut ne pas fonctionner si vous n'avez pas de contrôle sur les consommateurs (facile pour moi - je n'ai même pas d'équipe dans mon projet, je suis seul). Qu'avez-vous voulu dire par des méthodes auxiliaires gérant les relations bidirectionnelles? –

+0

@Mike comment auriez-vous manipulé avec la réflexion et la modification de la collection privée? :) –

Questions connexes