1 votes

Puis-je remplacer l'appel à Activator.CreateInstance() dans NHibernate ?

Existe-t-il un moyen de remplacer l'appel à Activator.CreateInstance() utilisé dans NHibernate 2.0.1GA pour construire les entités ? Idéalement, j'aimerais le remplacer par StructureMap.ObjectFactory.GetInstance().

4voto

Steve Willcock Points 11859

L'injection de constructeur ne permet pas d'y parvenir facilement. Les internes de NHibernate peuvent avoir besoin de créer un objet proxy hérité de votre classe de domaine avec du code de chargement paresseux, etc. saupoudré là-dedans, donc, pour autant que je sache, il n'y a pas d'option simple pour surcharger la construction de votre objet.

Vous peut L'injection de dépendances fonctionne assez facilement avec NHibernate, en écrivant un intercepteur qui construira l'objet pour vous via l'injection d'un ensemble de propriétés. Il y a un exemple de ceci aquí . Cet exemple utilise Windsor comme conteneur DI, mais vous pouvez bien sûr faire la même chose avec StructureMap - Voici les documents relatifs à StructureMap - consultez la section "Application de l'injection de setter à un objet existant (BuildUp)".

Attention : injecter des dépendances dans votre modèle de domaine est souvent considéré comme le symptôme d'un problème de conception, et de nombreuses personnes évitent de le faire, alors assurez-vous que c'est vraiment ce que vous voulez faire avant de commencer à coder !

2voto

Mauricio Scheffer Points 70470

Jetez un coup d'œil à ce post de Fabio Maulo (actuel lead dev de NHibernate), il a résolu ce problème il y a quelques mois. Le code est pour NHibernate 2.1 mais je pense qu'il pourrait être porté à 2.0.1GA en supprimant les parties IProxyFactoryFactory.

1voto

Paco Points 6156

Vous pouvez réaliser l'injection de setter en implémentant IInterceptor et en réalisant l'injection dans la méthode onload avec Objectfactory.BuildUp. C'est facile à mettre en œuvre, mais l'injection de setter n'est peut-être pas ce que vous voulez.

Vous pouvez réaliser l'injection de constructeur en mettant en œuvre votre propre IBytecodeProvider et ReflectionOptimizer. C'est un peu plus difficile à réaliser, mais c'est possible !

Je ne recommande pas d'injecter des éléments dans les entités. Dans 99,9 % des cas, cela conduira à une mauvaise conception et rendra impossible la stratification de votre conception. Peut-être êtes-vous confronté aux 0,01 % de cas où c'est la bonne chose à faire. C'est quelque chose que vous faites aussi souvent que de taper des instructions goto.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X