Я думаю, что самым простым способом является использование фабричного метода и объема запроса. Затем сеанс создается, когда это действительно необходимо, и сохраняется до конца запроса.
Использование только одного сеанса для каждого запроса облегчает работу, например, при использовании свойств отложенной загрузки.
Я не знаю о StructureMap, но с Castle Windsor мне нужна только одна строка
container.Register<ISession>(c => c.Resolve<ISessionFactory>().OpenSession(), LifeStyle.PerRequest);
и сессии работают как шарм.