if you are injecting the session into a service, the service must be
Transient, also with objects that utilize these service must be
transient. here are some examples
controller > dao > session. all must be transient
controller > service
> dao > session. controller and dao must be transient,
service can be a singleton, if necessary.
by default component lifestyles are "undefined" which defaults to
singletons.
On Jan 26, 3:54 pm, Sheri <[email protected]> wrote:
> ______________________
> By the way the error message is (sorry for swedish language in the
> message):
>
> System.ObjectDisposedException was unhandled by user code
> Message="Session is closed!\r\nObjektnamn: ISession."
> Source="NHibernate"
> ObjectName="ISession"
> StackTrace:
> vid NHibernate.Impl.AbstractSessionImpl.ErrorIfClosed()
> vid
> NHibernate.Impl.AbstractSessionImpl.CheckAndUpdateSessionStatus()
> vid NHibernate.Impl.SessionImpl.CreateCriteria(Type
> persistentClass, String alias)
> vid
> WebMonitorUpdate.Models.NHDataAccessObjects.OnlineSystemDAO.findByUsername
> (String username) i C:\Projects\WebMonitorUpdate\WebMonitorUpdate
> \Models\NHDataAccessObjects\OnlineSystemDAO.cs:rad 55
> vid
> WebMonitorUpdate.SQLServerServices.OnlineSystemService.getCustomerInfoByName
> (String username) i C:\Projects\WebMonitorUpdate\WebMonitorUpdate
> \SQLServerServices\OnlineSystemService.cs:rad 33
> vid
> WebMonitorUpdate.MembershipServicesImpl.SQLServerMembershipProvider.ValidateUser
> (String usernameAndSystemId, String password) i C:\Projects
> \WebMonitorUpdate\WebMonitorUpdate\MembershipServicesImpl
> \SQLServerMembershipProvider.cs:rad 139
> vid
> WebMonitorUpdate.MembershipServicesImpl.AccountMembershipService.ValidateUser
> (String systemId, String userName, String password) i C:\Projects
> \WebMonitorUpdate\WebMonitorUpdate\MembershipServicesImpl
> \AccountMembershipService.cs:rad 32
> vid WebMonitorUpdate.Validators.AccountValidators.ValidateLogOn
> (String systemId, String userName, String password, IMembershipService
> membershipService, ModelStateDictionary modelState) i C:\Projects
> \WebMonitorUpdate\WebMonitorUpdate\Validators\AccountValidators.cs:rad
> 50
> vid WebMonitorUpdate.Controllers.AccountController.LogOn(String
> systemId, String userName, String password, Boolean rememberMe, String
> returnUrl) i C:\Projects\WebMonitorUpdate\WebMonitorUpdate\Controllers
> \AccountController.cs:rad 70
> vid lambda_method(ExecutionScope , ControllerBase , Object[] )
> vid System.Web.Mvc.ActionMethodDispatcher.Execute
> (ControllerBase controller, Object[] parameters)
> vid System.Web.Mvc.ReflectedActionDescriptor.Execute
> (ControllerContext controllerContext, IDictionary`2 parameters)
> vid System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod
> (ControllerContext controllerContext, ActionDescriptor
> actionDescriptor, IDictionary`2 parameters)
> vid
> System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7
> ()
> vid
> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter
> (IActionFilter filter, ActionExecutingContext preContext, Func`1
> continuation)
> vid
> System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9
> ()
> vid
> System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters
> (ControllerContext controllerContext, IList`1 filters,
> ActionDescriptor actionDescriptor, IDictionary`2 parameters)
> vid System.Web.Mvc.ControllerActionInvoker.InvokeAction
> (ControllerContext controllerContext, String actionName)
> vid System.Web.Mvc.Controller.ExecuteCore()
> vid System.Web.Mvc.ControllerBase.Execute(RequestContext
> requestContext)
> vid
> System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute
> (RequestContext requestContext)
> vid System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase
> httpContext)
> vid System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext
> httpContext)
> vid
> System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest
> (HttpContext httpContext)
> vid System.Web.Mvc.MvcHttpHandler.VerifyAndProcessRequest
> (IHttpHandler httpHandler, HttpContextBase httpContext)
> vid System.Web.Routing.UrlRoutingHandler.ProcessRequest
> (HttpContextBase httpContext)
> vid System.Web.Routing.UrlRoutingHandler.ProcessRequest
> (HttpContext httpContext)
> vid
> System.Web.Routing.UrlRoutingHandler.System.Web.IHttpHandler.ProcessRequest
> (HttpContext context)
> vid WebMonitorUpdate._Default.Page_Load(Object sender,
> EventArgs e) i C:\Projects\WebMonitorUpdate\WebMonitorUpdate
> \Default.aspx.cs:rad 18
> vid System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr
> fp, Object o, Object t, EventArgs e)
> vid System.Web.Util.CalliEventHandlerDelegateProxy.Callback
> (Object sender, EventArgs e)
> vid System.Web.UI.Control.OnLoad(EventArgs e)
> vid System.Web.UI.Control.LoadRecursive()
> vid System.Web.UI.Page.ProcessRequestMain(Boolean
> includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
> InnerException:
>
> ______________________
>
> On 26 Jan, 21:41, Sheri <[email protected]> wrote:
>
> > Thanks a lot Jason for you help.
> > Sorry for my disturbance.
>
> > ((just a point to them who would like to use NH 2.1.2.4000 and latest
> > Castle versions, NHibernate.ByteCode.Castle source code should be
> > built by the latest version of Castle.Core and Castle.DynamicProxy2.))
>
> > I use IHttpModule to open/close session but I get "Session Closed"
> > error.
>
> > 1. web.config: I have current_session_context_class = web & <add
> > name="SessionScope" type="MyPackage.Helper.SessionScope, MyPackage"/>
> > in my httpModule section
> > 2. I have a daoFactory which is registered in container. this
> > daoFactory initialize all my DAOs. (But I do not have registered my
> > dao in the container directly. DAO classes are for CRUD operation)
> > 3. I have some services classes which has some dao as object for other
> > process with retrieved data from DAOs. In these services classes I
> > have initialized each dao through daofactory
> > 4. All my daos is inserted in castle section of web.config
>
> > I do not know why I get "session closed error". The only thing I can
> > guess is registration in container which I have some trouble to
> > understand.
> > SessionScope (that implements IHttpModule) should retrieve and close
> > session byself? or?
>
> > Thanks for any help
>
> > Regards
> > Sheri
>
> > On 25 Jan, 14:49, Jason Meckley <[email protected]> wrote:
>
> > > Sheri, this has been my approach with registering NH in Windsor.
>
> > > public NhibernateFacility : AbstractFacility
> > > {
> > > public override void Init()
> > > {
> > > var configuration = new Configuration().Configure();
> > > var factory = configuration.BuildSessionFactory();
> > > Kernel.AddComponentInstance("nhibernate_configuration",
> > > configuration);
> > > Kernel.AddComponentInstance("session_factory", );
> > > Kernel.Resolvers.Add(NhibernateSessionResolver(Kernel));
> > > //I could also use the factory method to resolve the
> > > session, but
> > > that can cause a memory leak if i don't also implement
> > > //a custom lifecyle for it. It's easier just to resolve
> > > the session
> > > with sub dependency resolver.
> > > //It's also easier to test in isolation.
> > > }
>
> > > }
>
> > > public NhibernateSessionResolver : ISubDependencyResolver
> > > {
> > > private readonly IKernel kernel;
>
> > > public NhibernateSessionResolver(IKernel kernel)
> > > {
> > > this.kernel = kernel;
> > > }
>
> > > public bool Resolve(CreationContext context,
> > > ISubDependencyResolver
> > > contextHandlerResolver, ComponentModel model, DependencyModel
> > > dependency)
> > > {
> > > return
> > > kernel.Resolve<ISessionFactory>().GetCurrentSession();
> > > }
>
> > > public bool CanResolve(CreationContext context,
> > > ISubDependencyResolver contextHandlerResolver, ComponentModel model,
> > > DependencyModel dependency)
> > > {
> > > return
> > > typeof(ISession).IsAssignableFrom(dependency.TargetType);
> > > }
>
> > > }
>
> > > new Configuration().Configure() will automatically load the
> > > hibernate.config file from the root directory of the project. part of
> > > this configuration will be a property defining the
> > > CurrentSessionContext web, thread, map, etc. the best choice for this
> > > will depend on where you are using this configuration. With this is
> > > place I can now inject a session into other objects.
>
> > > public class Foo
> > > {
> > > private readonly ISession session;
>
> > > public Foo(ISession session)
> > > {
> > > this.session = session;
> > > }}
>
> > > I can then register Foo into the container as well with a transient
> > > lifestyle and all will be resolved for me automatically.
>
> > > The next piece to consider is managing when to open/close the session.
> > > I work with web applications and use an HttpModule to manage the
> > > session.
> > > public class SessionScope : IHttpModule
> > > {
> > > public void Init(HttpApplication context)
> > > {
> > > context.BeginRequest += OpenSession;
> > > context.EndRequest += CloseSession;
> > > }
>
> > > private void OpenSession(object sender, EventArgs e)
> > > {
> > > var factory = WindsorContainerAccessorUtil.ObtainConatiner
> > > ().Resolve<ISessionFactory>();
> > > CurrentSessionContext.Bind(factory.OpenSession());
> > > }
>
> > > private void CloseSession(object sender, EventArgs e)
> > > {
> > > var factory = WindsorContainerAccessorUtil.ObtainConatiner
> > > ().Resolve<ISessionFactory>();
> > > if (!CurrentSessionContext.HasBind(factory)) return;
>
> > > var session = CurrentSessionContext.Unbind(factory);
> > > session.Dispose();;
> > > }}
>
> > > and I register this module in web.config. then I need to manage my
> > > transactions. I use Monorail as my web framework and create a filter
> > > to
>
> ...
>
> read more »
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/nhusers?hl=en.