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
http://groups.google.com/group/castle-project-users/browse_thread/thread/b8f52a3640ffb654 –
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? –