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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top