Incidentally, I figured out what my problem was. If you're using
Windows 7 or IIS 7 on 2k8, you need to register the module in
system.webserver.modules, not system.web.httpmodules (or maybe in
addition to, I have both so it runs on IIS6).

On Tue, Nov 3, 2009 at 7:53 PM, Shawn Hinsey <[email protected]> wrote:
> The only non-web.config standard XML config I have in my MVC app is
> log4net. I have the factory, nhibernate, logging, and ATM facilities
> and am resolving controllers from Windsor 2.0.
>
> I will end up implementing session per request if I have to, but I
> want to make sure I understand how to use the castle stuff before i
> write my own because the castle code will always have more eyes on it
> than mine.
>
> On Tue, Nov 3, 2009 at 7:41 PM, Jason Meckley <[email protected]> wrote:
>>
>> the mechanics of NH Manager are more complex then they need to be.
>> that may be the state of NH when it was first introduced.I also don't
>> like the dependency on required castle xml configs, when I can write
>> it out in code using FNH. It's really straight forward setting up
>> session per request. another reason I like rolling my own: managing
>> the dependencies across projects is much simpler. FNH is the only 3rd
>> party extension on top of NH.
>>
>> On Nov 3, 5:39 pm, Shawn Hinsey <[email protected]> wrote:
>>> This is using your own custom NH facility, right? It's my
>>> understanding that the castle NH facility does these things for you,
>>> it's just not entirely clear to me how to use it. I don't see why else
>>> using it in web mode would require the use of an HttpModule, but I
>>> can't simply take a dependency in ISession unless I am missing some
>>> step not covered in the documentation.
>>>
>>> I will build this out along the lines you've discussed if I need to,
>>> but I'd prefer not to own that code if I can avoid it.
>>>
>>> On Tue, Nov 3, 2009 at 1:21 PM, Jason Meckley <[email protected]> 
>>> wrote:
>>>
>>> > no, you are still managing the session's scope. you simply tie the
>>> > scope of the session to the request.
>>>
>>> > you would *not* have using blocks in your code
>>> > using(var s = f.opensession())
>>> > {
>>> > }
>>>
>>> > here is the code I'm using the manage session scope and transactions.
>>>
>>> >  public class SessionModule : IHttpModule
>>> >    {
>>> >        private TransactionScope transaction;
>>>
>>> >        public void Init(HttpApplication context)
>>> >        {
>>> >            context.BeginRequest += OpenSessions;
>>> >            context.EndRequest += DisposeOfSessions;
>>> >        }
>>>
>>> >        private void OpenSessions(object sender, EventArgs e)
>>> >        {
>>> >            var options = new TransactionOptions {IsolationLevel =
>>> > IsolationLevel.ReadCommitted};
>>> >            transaction = new TransactionScope
>>> > (TransactionScopeOption.Required, options);
>>>
>>> >            var session = WindsorContainerAccessorUtil
>>> >                .ObtainContainer()
>>> >                .Resolve<ISessionFactory>()
>>> >                .OpenSession();
>>> >            ManagedWebSessionContext.Bind(HttpContext.Current,
>>> > session);
>>> >        }
>>>
>>> >        private void DisposeOfSessions(object sender, EventArgs e)
>>> >        {
>>> >            if (HttpContext.Current.Error == null)
>>> >                    transaction.Complete();
>>>
>>> >            var factory = WindsorContainerAccessorUtil
>>> >                .ObtainContainer()
>>> >                .Resolve<ISessionFactory>();
>>> >            ManagedWebSessionContext.Unbind(HttpContext.Current,
>>> > factory).Dispose();
>>>
>>> >            transaction.Dispose();
>>> >        }
>>>
>>> >        public void Dispose()
>>> >        {
>>> >        }
>>> > }
>>>
>>> > then I have my controllers and/or services
>>> > public class MyController : SmartDispatchController
>>> > {
>>> >     private ISession session;
>>>
>>> >     public MyController(ISession session)
>>> >     {
>>> >             this.session = session;
>>> >     }
>>> > }
>>>
>>> > and finally the facility to wire all this together
>>> > public class NhibernateFacility : AbstractFacility
>>> > {
>>> >    protected override void Init()
>>> >    {
>>> >        var configuration = Fluently
>>> >            .Configure()
>>> >            .Database(MsSqlConfiguration
>>> >                          .MsSql2000
>>> >                          .ProxyFactoryFactory(typeof
>>> > (ProxyFactoryFactory).AssemblyQualifiedName)
>>> >                          .ConnectionString(builder =>
>>> > builder.FromConnectionStringWithKey("key")))
>>> >            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Entity>
>>> > ())
>>> >            .ExposeConfiguration(cfg => cfg
>>> >                                            .SetProperty
>>> > (Environment.PrepareSql, true.ToString())
>>> >                                            .SetProperty
>>> > (Environment.CurrentSessionContextClass, typeof
>>> > (ManagedWebSessionContext).AssemblyQualifiedName))
>>> >            .BuildConfiguration();
>>> >        var factory = configuration.BuildSessionFactory();
>>>
>>> >        Kernel.AddComponentInstance<Configuration>(configuration);
>>> >        Kernel.AddComponentInstance<ISessionFactory>(factory);
>>> >        Kernel.Register(Component
>>> >                            .For<ISession>()
>>> >                            .LifeStyle.Is(LifestyleType.Transient)
>>> >                            .UsingFactoryMethod(k =>
>>> > k.Resolve<ISessionFactory>().GetCurrentSession()));
>>> >    }
>>> > }
>>>
>>> > this approach also requires the FactoryFacility to use the factory
>>> > methods. You could replace the factory method with a
>>> > SubDependencyResolver.
>>>
>>> > On Nov 3, 11:58 am, Shawn Hinsey <[email protected]> wrote:
>>> >> So to clarify, even though I might dispose a session from the session
>>> >> manager, it will be kept alive until the end of the request by the
>>> >> infrastructure?
>>>
>>> >> I would have to set it up again but I am fairly certain I saw behavior
>>> >> roughly like this:
>>>
>>> >> MyPersistentObject po;
>>>
>>> >> using(var session = _sessionManager.OpenSession()
>>> >> {
>>> >>    po = session.Find...
>>>
>>> >> }
>>>
>>> >> // later, in a controller
>>>
>>> >> po.LazyCollection
>>>
>>> >> throw an exception about a missing session.
>>>
>>> >> On Tue, Nov 3, 2009 at 2:10 AM, Tuna Toksoz <[email protected]> wrote:
>>> >> > in a web environment, what is done in NH Facility is that the session 
>>> >> > is
>>> >> > opened at the beginning of the http request, stored in web session. 
>>> >> > Atthe
>>> >> > end of the request, it is committer and disposed. Using this logic 
>>> >> > allows
>>> >> > you to have lazy loading working pretty easily. It comes with 
>>> >> > downsides,
>>> >> > though.
>>>
>>> >> > Tuna Toksöz
>>> >> > Eternal sunshine of the open source mind.
>>>
>>> >> >http://devlicio.us/blogs/tuna_toksoz
>>> >> >http://tunatoksoz.com
>>> >> >http://twitter.com/tehlike
>>>
>>> >> > On Tue, Nov 3, 2009 at 8:43 AM, Shawn Hinsey <[email protected]> 
>>> >> > wrote:
>>>
>>> >> >> I'm having a bit of trouble understanding exactly how session
>>> >> >> management works when using the NH facility in an ASP.NET MVC
>>> >> >> environment, particularly when it comes to lazy loading. I'm not sure
>>> >> >> if the pattern in the documentation of disposing the session inside of
>>> >> >> a dao/repository method is the best way to go or if there is another
>>> >> >> approach I should be using.
>>>
>>> >> >> Can anyone point me at a good resource? I haven't had much luck
>>> >> >> googling. I took a look at S#arp Architecture but I wasn't really sure
>>> >> >> where to start, so a pointer to a source file in their repo would also
>>> >> >> be appreciated.
>>>
>>> >> >> Thanks,
>>> >> >> Shawn
>> >>
>>
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" 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/castle-project-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to