1

Dans mon DefaultRegistry J'ai cette configuration:Dans StructureMap, comment puis-je modifier le InstanceScope lors de l'exécution?

ForRequestedType<INHUnitOfWork>().CacheBy(InstanceScope.HttpContext) 
     .TheDefault.Is.OfConcreteType<NHibernateUnitOfWork>(); 

À un certain moment dans le flux d'applications Web Je souhaite modifier le InstanceScope à HttpSession pour obtenir une longue conversation, donc je fais ceci:

PluginTypeConfiguration config = ObjectFactory.Model.PluginTypes.FirstOrDefault(p => p.PluginType.FullName.Contains("INHUnitOfWork")); 
config.Lifecycle.EjectAll(); 
config.Lifecycle = StructureMap.Pipeline.Lifecycles.GetLifecycle(InstanceScope.HttpSession); 

Cela semble remplacer le InstanceScope initial, malheureusement il ne dure que pour la requête en cours. Lorsque la demande suivante arrive, la configuration initiale est à nouveau active et les informations de session sont perdues.

Plus tard, je veux aussi être en mesure de revenir le changement avec quelque chose comme ceci:

PluginTypeConfiguration config = ObjectFactory.Model.PluginTypes.FirstOrDefault(p => p.PluginType.FullName.Contains("INHUnitOfWork")); 
config.Lifecycle.EjectAll(); 
config.Lifecycle = StructureMap.Pipeline.Lifecycles.GetLifecycle(InstanceScope.HttpContext); 

mais si je vais le faire fonctionner dans un sens, il ne fonctionnera probablement dans les deux.

Est-il possible de remplacer le InstanceScope initial de manière permanente lors de l'exécution? Comment cela devrait-il être mis en œuvre? Aussi, pensez-vous que c'est un bon moyen d'obtenir une longue conversation ou qu'il existe une meilleure façon de le faire avec StructureMap & NHibernate?

Répondre

1

Jetez un oeil à l'explication détaillée de Ayende sur la façon de permettre à de longues conversations en cours d'exécution et UnitOfWork:

http://ayende.com/Wiki/Default.aspx?Page=HttpModules&AspxAutoDetectCookieSupport=1

Je recommande la création d'un module UnitOfWorkApplication et le rendre responsable de la création d'une instance UnitOfWork et l'ajouter à le conteneur avant que votre code ne s'exécute (avant que la demande ne soit traitée, comme dans l'exemple). De cette façon, vous avez plus de flexibilité et de contrôle sur la façon dont l'unité de travail est créée.

+0

Création d'une classe UnitOfWorkApplication pour gérer la création et la création de UnitOfWork StructureMap injecter les instances UnitOfWorkApplication au lieu des instances UnitOfWork a résolu le problème. Merci beaucoup, votre explication était exactement ce dont j'avais besoin. – abutnaru

0

Cela me semble un peu étrange ce que vous essayez de faire. Les chemins que j'essaierais seraient

  • Configurer une instance nommée dans StructureMap qui implémente également cette interface mais qui a une portée différente. Vous pouvez injecter des dépendances différentes pour différents consommateurs d'interface, peut-être que cela aide?
  • Écrivez votre propre CacheInterceptor qui implémente efficacement votre cycle de vie spécifique.

Cette dernière est réalisée par ex. ici pour le cycle de vie WCF: http://blogs.rpionline.com/post/2009/02/How-to-use-NHibernate-and-StructureMap-in-a-WCF-application.aspx

Questions connexes