In StructureMap, come posso cambiare l'InstanceScope in fase di esecuzione?
-
05-09-2019 - |
Domanda
Nel mio DefaultRegistry ho questa configurazione:
ForRequestedType<INHUnitOfWork>().CacheBy(InstanceScope.HttpContext)
.TheDefault.Is.OfConcreteType<NHibernateUnitOfWork>();
Ad un certo punto nel flusso applicazione web voglio cambiare l'InstanceScope per HttpSession per ottenere una lunga conversazione, quindi faccio questo:
PluginTypeConfiguration config = ObjectFactory.Model.PluginTypes.FirstOrDefault(p => p.PluginType.FullName.Contains("INHUnitOfWork"));
config.Lifecycle.EjectAll();
config.Lifecycle = StructureMap.Pipeline.Lifecycles.GetLifecycle(InstanceScope.HttpSession);
Questo sembra sostituire l'InstanceScope iniziale, purtroppo dura solo per la richiesta corrente. Quando la richiesta successiva arriva, la configurazione iniziale è di nuovo attivo e le informazioni sulla sessione viene perso.
In seguito Voglio anche essere in grado di annullare la modifica con qualcosa di simile:
PluginTypeConfiguration config = ObjectFactory.Model.PluginTypes.FirstOrDefault(p => p.PluginType.FullName.Contains("INHUnitOfWork"));
config.Lifecycle.EjectAll();
config.Lifecycle = StructureMap.Pipeline.Lifecycles.GetLifecycle(InstanceScope.HttpContext);
, ma se riuscirò a farlo funzionare in una direzione che probabilmente funzionerà in entrambi.
E 'possibile sostituire l'InstanceScope iniziale in modo permanente in fase di esecuzione? Come questo dovrebbe essere attuata? Inoltre, pensi che questo un buon modo per ottenere una lunga conversazione o c'è un / modo migliore più semplice farlo con StructureMap e NHibernate?
Soluzione
Date un'occhiata a spiegazione dettagliata di Ayende su come attivare conversazioni lunga esecuzione e UnitOfWork:
http://ayende.com/Wiki/Default.aspx?Page=HttpModules&AspxAutoDetectCookieSupport = 1
mi sento di raccomandare la creazione di un modulo di UnitOfWorkApplication e renderlo responsabile della creazione di un'istanza UnitOfWork e aggiungendolo al contenitore prima che i vostri esegue del codice (prima che la richiesta viene elaborata, come nell'esempio). In questo modo si dispone di una maggiore flessibilità e controllo su come si crea unità di lavoro.
Altri suggerimenti
Suona un po 'strano per me ciò che si sta cercando di fare. Itinerari Mi piacerebbe provare sarebbe
- Configura un'istanza denominata in StructureMap che implementa anche detta interfaccia, ma è ambito diverso. È possibile iniettare le dipendenze differenti per differenti consumatore interfaccia, forse che aiuta?
- Scrivi la tua CacheInterceptor che implementa in modo efficace il vostro ciclo di vita specifici.
L'ultimo è fatto per esempio qui per WCF ciclo di vita: http://blogs.rpionline.com/post/2009/02/How-to-use-NHibernate-and-StructureMap-in-a-WCF-application.aspx