2009-12-24 7 views
1

J'inscris des composants liés à Linq2Sql en utilisant PerWebRequest lifestyle. Je les vois être créés, mais ils sont détruits avant l'appel de la méthode Application_EndRequest de mon global. Est-ce que c'est par conception? Est-ce que quelqu'un sait un travail autour? Je veux appeler commit sur mon objet UnitOfWork à submitchanges() à la fin de chaque requête. En plus d'utiliser Global.asax Application_EndResult, j'ai également essayé un IHttpModule avec les mêmes résultats. J'utilise Castle 2.0.Castle Windsor PerWebRequest LifeStyle et Application_EndRequest

Voici comment j'enregistre mon contenu avec PerWebRequest. Je crée un objet DataCOntextProvider qui tient sur un DataContext L2S. Cet objet est injecté dans le UoW.

/// <summary> 
     /// Register the IUnitOfWorkManager to resolve to LinqToSqlUnitOfWorkManager per web request 
     /// </summary> 
     public void RegisterLinq2SqlUnitOfWorkPerWebRequest() 
     { 
      _container.Register(Component.For<IUnitOfWorkManager>() 
       .LifeStyle.PerWebRequest 
       .ImplementedBy<LinqToSqlUnitOfWorkManager>()); 
     } 

    /// <summary> 
    /// Register the IDataContextProvider to resolve to DataContextProvider per web request 
    /// </summary> 
    public void RegisterDataContextProviderPerWebRequest() 
    { 
     _container.Register(Component.For<IDataContextProvider>() 
      .LifeStyle.PerWebRequest 
      .ImplementedBy<DataContextProvider>()); 
    } 

Maintenant, je suis tout simplement essayer de tirer le UOW du récipient via le CommonServiceLocator (à la fois CSL et adaptateur Windsor sont 1,0) de la EndRequest comme ceci:

protected void Application_EndRequest(object sender, EventArgs e) 
    { 
     //ignore unless this is a page (.aspx) or handler (.ashx) 
     if (!RequestCanHaveContext()) 
      return; 

     //get the IUnitOfWork manager 
     var uow = ServiceLocator.Current.GetInstance<IUnitOfWorkManager>(); 

     //if we have one, commit changes at the end of the request 
     if (uow != null) 
     { 
      //don't explicitly dispose of uow or we'll get Disposed exceptions on the context 
      uow.Commit(); 
     } 

    } 

Merci, Corey

+0

http://groups.google.com/group/castle-project-users/browse_thread/thread/b8f52a3640ffb654 –

+0

Avez-vous vérifié que le gestionnaire d'endrequest de votre module s'exécute avant la destruction du composant? En outre, où/comment gérez-vous l'événement détruit du noyau? –

Répondre

0

Essayez de déplacer votre code Application_EndRequest à un httpmodule et l'enregistrer avant le PerWebRequestLifestyleModule.

+0

Je l'ai fait. Je me retrouve avec un comportement très bizarre - les choses se créent/se détruisent sans lancer l'événement Destroyed de Micro Kernel. Je ne sais pas si c'est ASP.NET qui me cause de la douleur. –

+0

avez-vous vérifié que le gestionnaire endrequest de votre module s'exécute avant la destruction du composant? En outre, où/comment gérez-vous l'événement détruit du noyau? –

1

votre implémentation de IUnitOfWorkManager doit implémenter IDisposable et dans le processus d'annulation d'envoi SubmitChanges. Vous pouvez également utiliser la désactivation personnalisée pour soumettre des modifications.