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
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. –
@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? –
@Mike comment auriez-vous manipulé avec la réflexion et la modification de la collection privée? :) –