2010-06-29 13 views
2

Je migre mon application web mvc pour utiliser Nhibernate Facility pour gérer Sessions Nhibernate.Château Windsor Nhibernate Installation chargement paresseux

Je rencontre ce problème étrange;

Lorsque j'enregistrer SessionWebModule sous web.config/httpModules via:

<add name="NHibernateSessionWebModule" 
type="Castle.Facilities.NHibernateIntegration.Components.Web.SessionWebModule, 
Castle.Facilities.NHibernateIntegration" /> 

système est incapable d'objets de charge paresseux. Je n'ai pas d'exception de session. Si je ne l'ajoute pas à web.config, le chargement paresseux fonctionne correctement. Tout part de ceci semble être OK dans la mesure où regiter le conteneur Windsor et l'enregistrement de Nhibernate Facility va. Nhibernate La fonction est capable de fournir le gestionnaire de session et le conteneur Windsor est capable de résoudre les objets.

Bien sûr, sans SessionWebModule Nhibernate Facility est presque inutile pour moi comme dans cette situation, il n'est pas en mesure de gérer correctement sessions. Je vois datareader est déjà des exceptions de type ouvert qui sont pas bon ..

Je suis coincé et dois d'urgence obtenir passé ce problème, je vais apprécier toute aide de votre part.

J'inclus ci-dessous quelques sections de ma configuration et le code à donner plus d'informations

Web.config:

<castle> 
     <facilities> 
      <facility id="nhibernatefacility" isWeb="false" 
type="Castle.Facilities.NHibernateIntegration.NHibernateFacility, 
Castle.Facilities.NHibernateIntegration"> 
       <factory id="nhibernate.factory"> 
        <settings> 
         <item 
key="connection.provider">NHibernate.Connection.DriverConnectionProvider</ 
item> 
         <item 
key="connection.driver_class">NHibernate.Driver.SqlClientDriver</item> 
         <item key="connection.connection_string">Data 
Source=zzz;Database=xxx;Trusted_Connection=True;</item> 
         <item 
key="dialect">NHibernate.Dialect.MsSql2005Dialect</item> 
         <item 
key="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, 
NHibernate.ByteCode.LinFu</item> 
         </settings> 
        <assemblies> 
         <assembly>AppWeb.Domain</assembly> 
        </assemblies> 
       </factory> 
      </facility> 
     </facilities> 
    </castle> 

<system.webServer> 
     <validation validateIntegratedModeConfiguration="false" /> 
     <modules runAllManagedModulesForAllRequests="true"> 
       <add name="NHibernateSessionWebModule" 
type="Castle.Facilities.NHibernateIntegration.Components.Web.SessionWebModule, 
Castle.Facilities.NHibernateIntegration" /> 
     </modules> 
</sytem.webServer> 

Global.asax

public class MvcApplication : System.Web.HttpApplication, 
IContainerAccessor 
    { 
     private static IWindsorContainer container; 

     public IWindsorContainer Container 
     { 
      get { return container; } 
     } 

     void Application_Error(Object sender, EventArgs e) 
     { 
      Logger.Error(Server.GetLastError()); 
     } 

     public static void RegisterRoutes(RouteCollection routes) 
     { 
      #region Ignores 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      routes.IgnoreRoute("admin/{*url}"); 
      #endregion 

      routes.MapRoute(
       "Default", 
       "{controller}/{action}/{id}", 
       new { controller = "Home", action = "Main", id = "" }, 
       new { controller = @"[^\.]*" } 
      ); 
     } 

     protected void Application_Start() 
     { 
      RegisterRoutes(RouteTable.Routes); 
      log4net.Config.XmlConfigurator.Configure(); 
      SetupWindsor(); 
     } 

     private void SetupWindsor() 
     { 
      container = new WindsorContainer(new XmlInterpreter()); 

      container.Register(
         AllTypes 
          .FromAssemblyContaining<UserRepository>() 
          .Where(t => t.Name.EndsWith("Repository", 
StringComparison.Ordinal)) 
          .WithService 
          .FirstInterfaceOnType() 
          .Configure(r => 
r.LifeStyle.PerWebRequest), 

AllTypes.FromAssembly(Assembly.GetExecutingAssembly()) 
          .BasedOn<IController>() 
          .Configure(c => 
c.LifeStyle.PerWebRequest), 

        ); 
        //.AddFacility<TransactionFacility>(); 

      ControllerBuilder.Current.SetControllerFactory(new 
WindsorControllerFactory(container)); 
     } 
    } 

exception de chargement Lazy:

[LazyInitializationException: In itializing [AppWeb.Domain.City # 31135] - Impossible d 'initialiser proxy - aucune session] NHibernate.Proxy.AbstractLazyInitializer.Initialize() +138 NHibernate.Proxy.AbstractLazyInitializer.GetImplementation() +37 NHibernate.ByteCode.. LinFu.LazyInitializer.Intercept (InvocationInfo info) +72 CityProxy.get_Name() +143 ASP.views_tour_filters_ascx .__ Render__control1 (HtmlTextWriter __W, contrôle parameterContainer) dans c: \ wwwroot \ AppWeb \ AppWeb.Web \ Views \ tour \ Filters.ascx: 14 System.Web.UI.Control.RenderChildrenInternal (HtmlTextWriter writer, Enfants ICollection) +256 System.Web.UI.Control.RenderChildren (HtmlTextWriter writer) +19 System.Web.UI.Control.Render (écrivain HtmlTextWriter) 10 System.Web.UI.Control.RenderControlInternal (écrivain HtmlTextWriter, adaptateur ControlAdapter) +27 System.Web.UI.Control.RenderControl (HtmlTextWriter écrivain, adaptateur ControlAdapter) +99 System.Web.UI.Control.RenderControl (écrivain HtmlTextWriter) +25 System.Web.UI.Control.RenderChildrenInternal (écrivain HtmlTextWriter, enfants ICollection) +134 System.Web.UI .Control.RenderChildren (writer HtmlTextWriter) +19 System.Web.UI.Page.Render (writer HtmlTextWriter) +29 System.Web.Mvc.ViewPage.Rendu (HtmlTextWriter écrivain) +59 System.Web.UI.Control.RenderControlInternal (écrivain HtmlTextWriter, adaptateur ControlAdapter) +27 System.Web.UI.Control.RenderControl (écrivain HtmlTextWriter, adaptateur ControlAdapter) +99 système. Web.UI.Control.RenderControl (écrivain HtmlTextWriter) +25 de System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1266

Répondre

3

Il est par la conception. Vous devez garder votre session ouverte. Si vous faites du Web, je vous suggère d'ouvrir la session au début de la demande et de la fermer à la fin.

Obtenez les échantillons de cet article: http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx

+1

Im en utilisant « Nhibernate Facility » qui est censé gérer toute la gestion de la session ... – kaivalya

+2

Peut-être, mais dans votre code, vous disposez de la session en utilisant explicitement « Utilisation ». –

+1

Nhibernate Facility dispose d'un mécanisme de mise en cache qui met en cache les objets et les réutilise dans le même contexte. J'ai mis à jour ma question après avoir découvert que mon problème n'était pas lié aux instructions using. Le chargement paresseux échoue indépendamment des instructions using dès que j'inscris le SessionWebModule requis – kaivalya

0

Si vous utilisez MVC, j'utiliser un filtre d'action pour fermer les sessions NHibernate

public class NHibernateSessionAttribute : ActionFilterAttribute 
{ 
    public NHibernateSessionAttribute() 
    { 
     Order = 100; 
    } 


    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     if (filterContext.IsChildAction) return; 

     SessionSource.EndContextSession(); 
    } 
} 

SessionSource est où je gère la création de mes sessions ... et la méthode appelle essentiellement SessionSource.EndContextSession():

public static void EndContextSession() 
    { 
     var session = CurrentSessionContext.Unbind(Factory); 
     if (session != null && session.IsOpen) 
     { 
      try 
      { 
       if (session.Transaction != null && session.Transaction.IsActive) 
       { 
        // an unhandled exception has occurred and no db commit should be made 
        session.Transaction.Rollback(); 
       } 
      } 
      finally 
      { 
       session.Close(); 
       session.Dispose(); 
      } 
     } 
    } 
0

Je crois que vous devez définir l'attribut isWeb true :

<facility id="nhibernatefacility" isWeb="true" type="Castle.Facilities.NHibernateIntegration.NHibernateFacility, Castle.Facilities.NHibernateIntegration"> 
+1

Pourquoi avez-vous ajouté cet attribut? qu'est-ce que ça change? – toxicate20