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().
Réponses
Trop de publicités?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 !
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.
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.