c# - Nested NHibernateFacility SessionManager.OpenSession calls -
i feel i'm misunderstanding something. @ following code. have defaultsessionlifestyleoption.sessionpertransaction set, sessions have different session ids though they're in same transaction. expected 1 session, there's two.
what doing wrong, , how make want? should instead inject isession program , have methods use session? won't lose benefits of sessionmanager autotxfacility?
using castle.facilities.autotx; using castle.facilities.factorysupport; using castle.facilities.nhibernate; using castle.facilities.typedfactory; using castle.microkernel.registration; using castle.transactions; using castle.windsor; using fluentnhibernate.cfg; using fluentnhibernate.cfg.db; using nhibernate; using system; using system.transactions; namespace sandbox { public class dbinstaller : inhibernateinstaller { public fluentconfiguration buildfluent() { return fluently.configure() .database(mssqlconfiguration.mssql2008.connectionstring("server=localhost;integrated security=true;")); } public maybe<iinterceptor> interceptor { { return maybe.none<iinterceptor>(); } } public bool isdefault { { return true; } } public void registered(isessionfactory factory) { } public string sessionfactorykey { { return "foo"; } } } public class program { public isessionmanager sessionman { get; set; } static void main(string[] args) { iwindsorcontainer container = new windsorcontainer(); container .register(component.for<inhibernateinstaller>().implementedby<dbinstaller>()) .addfacility<factorysupportfacility>() // used autotxfacility, dont use directly @ time .addfacility<typedfactoryfacility>() // used autotxfacility, we're using somewhere .addfacility<autotxfacility>() // automatically manages db transactions us, if want. .addfacility<nhibernatefacility>(x => x.defaultlifestyle = defaultsessionlifestyleoption.sessionpertransaction) .register( component.for<program>().implementedby<program>().lifestyletransient()); var p = container.resolve<program>(); p.foo(); } [transaction(transactionscopeoption.required)] public virtual void foo() { using (var session = sessionman.opensession()) { console.writeline("foo: {0}", ((nhibernate.impl.sessionimpl)session).sessionid); bar(); } } public virtual void bar() { using (var session = sessionman.opensession()) { console.writeline("bar: {0}", ((nhibernate.impl.sessionimpl)session).sessionid); } } } }
Comments
Post a Comment