good to know you solved the problem!
I would make 1 tiny change to the transaction code (assuming you can
resolve the session from the container directly.)
using (var tx = WindsorContainerAccessorUtil
.ObtainContainer()
.Resolve<ISession>()
.BeginTransaction())
{
try
{
...
tx.Commit();
}
catch
{
tx.Rollback();
throw;
}
}
Another approach to managing the session would be implementing an
Interceptor (similar to filters) IInterceptor is part of Castle and
can be applied to any component (not a sealed class and virtual
members) registered in the container. with this you could do something
like
class TransactionInterceptor:IInterceptor
{
private ISession session;
public TransactionInterceptor(ISession session)
{
this.session = session;
}
public void Intercept(IInvocation invocation)
{
if(session.Transaction.IsActive)
{
invocation.Proceed();
return;
}
using(var tx = session .BeginTransaction())
{
try
{
invocation.Proceed();
tx.Commit();
}
catch
{
tx.Rollback();
throw;
}
}
}
}
there is the issue that interceptors will intercept all calls to
public/protected virtual memebers and you may not want a transaction
on every one. For that you can Implement IOnBehalfOf (or IAwareOf, I
forget exactly) which allows you to selectively choose when the
invocation is intercepted. I'm not 100% sure how to use/configure it.
The only implementation I have seen was on a blog post by Ayende way
back in the day dealing with query caching and generic repositories.
On Jan 29, 5:21 am, Sheri <[email protected]> wrote:
> Thanks Jason
>
> I have had an overridden controller factory almost like yours here. It
> is solved now.
>
> The only thing that I do not use is Filter for managing transaction.
> The reason is I use ASP .NET MVC Controller which I cannot use Filter
> in Monorail (due to confliction).
>
> Due to lack of time I am satisfied to use:
>
> using (ITransaction tx = WindsorContainerAccessorUtil.ObtainContainer
> ().Resolve<ISessionFactory>().GetCurrentSession().BeginTransaction())
> {
> ...
>
> }
>
> Thanks once again
> /Sheri
>
> On Jan 29, 3:03 am, Jason Meckley <[email protected]> wrote:
>
> > I don't have anything concrete handy, but here is the concept.
> > MVC has an interface, well call it IControllerFactory. that has a
> > single method.
> > interface IControllerFactory
> > {
> > IController CreateController(Uri uri)}
>
> > the framework comes with a default implementation. we'll call it
> > class DefaultControllerFactory : IControllerFactory
> > {
> > public IController CreateController(Uri uri)
> > {
> > ...
> > }}
>
> > you can ovrride this by creating your own implementation
> > class WindsorControllerFactory : IControllerFactory
> > {
> > IKernel kernel;
> > WindsorControllerFactory(IKernel kernel)
> > {
> > this.kernel = kernel;
> > }
> > public IController CreateController(Uri uri)
> > {
> > var key = parse IContoller key from uri.
> > return kernel.Resolve<IController>(key);
> > }}
>
> > Now that we have this new implementation of the controller factory we
> > need to tell MVC to use this one instead of the default.
> > class Global: HttpApplication
> > {
> > private static IWindsorContainer container;
> > public void Application_Start(object sender, EventArgs e)
> > {
> > container = new WindsorContainer
> > ().AddComponent<WindsorControllerFactory>();
> > SomeMvcConfigurationObject.ControllerFactoryToUse =
> > container.Resolve<WindsorControllerFactory>();
> > }}
>
> > and now your controllers are resolved from your factory instead of the
> > default. MvcContrib (http://www.codeplex.com/MVCContrib) does most of
> > this work for you. if you reference mvccontrib in your project you can
> > use this to enhance the default MVC features.
>
> > "How long does it take to be a capable developer like you?! "
> > I have been a developer for ~9 years. I didn't have a clue what i was
> > doing for the first 5. the turning point for me was *nothin' but .net*
> > (http://www.jpboodhoo.com/training.oo). Up until then I had no idea
> > what OOP really was. after than projects like Castle and Nhibernate
> > made more sense and i could understand what was happening when I
> > looked at the code.www.ayende.com,www.codebetter.comandwww.lostechies.com
> > also helped me progress.
>
> > On Jan 28, 4:24 pm, Sheri <[email protected]> wrote:
>
> > > Hi Jason
> > > Thanks again
> > > I really appreciate all your help.
> > > I have solved my problem but it is not the real one! maybe I need
> > > more knowledge to understand your comments.
> > > Your comments are advance comment so I need read them more than once
> > > to understand. (typically junior developer!)
>
> > > If you have some example for your description below I am very thankful
> > > otherwise I am still very thankful for all that time you spent to help
> > > me.
>
> > > Best Regards
> > > Sheri
> > > P.S. How long does it take to be a capable developer like you?!
>
> > > On 28 Jan, 15:25, Jason Meckley <[email protected]> wrote:
>
> > > > Ah, ok. I'm not familar with OoTB, but the MS MVC default ctor issue I
> > > > do know about. The default controller resolution method for MS MVC is
> > > > using a default constructor. But you can override this by implementing
> > > > your own ControllerFactory. There may also be other factory interfaces
> > > > you can replace to resolve Filters, membership, etc. If so you would
> > > > want to override these as well. where the the Factory implementation
> > > > would resolve the objects from the kernel.
>
> > > > I use Monorail which ties in very nicely with Windsor, so i take for
> > > > granted that Filters/Controller/etc are resolved from the Kernel.
> > > > There is a project called MvcContrib which is primarly maintained by
> > > > HeadSpring. If you are not familar with this project I would highly
> > > > recommend it. It picks up with MS MVC stops.
>
> > > > If there isn't a way to change how the membership provider is created.
> > > > you will need to find a hook to inject the dependencies via
> > > > properties. it would look something like
>
> > > > var provider = GetProviderByDefaultCtor.
> > > > provider.Dependency = kernel.Resolve<Dependency>();
> > > > //then return or use the provider.
>
> > > > Not as clean, but it gets the dependencies into the provider.
>
> > > > On Jan 28, 7:48 am, Sheri <[email protected]> wrote:
>
> > > > > Hope I do not make you angry with my daily questions!!
>
> > > > > I have followed all advices. Everything works fine and SessionScope
> > > > > seems to be worked fine. but I still have "Session Closed!" error. I
> > > > > get this error exactly when the logined page will appear after login!
>
> > > > > The reason that I got through debug is "Membership Provider". this
> > > > > OoTB approach need default constructor, and DI needs another
> > > > > constructor for DI objects, the problem begins here. Membership
> > > > > Provider initialized (default ctor) by ASP .NET MVC oOTB membership
> > > > > approach and when the user will log in Membership provider initializes
> > > > > via DI (ctor with DI objects) again that I guess the older session is
> > > > > no more active.
>
> > > > > tired of these conflicts and lack of my knowledge to solve it :-S
>
> > > > > Any idea?
>
> > > > > Thanks once again and again
> > > > > /Sheri
>
> > > > > On 27 Jan, 16:20, Jason Meckley <[email protected]> wrote:
>
> > > > > > you lost me :) i think I get it, but want to be sure.
> > > > > > 1. you are subclassing asp.net MembershipProvider
> > > > > > 2. your implementation utilizes ISession
> > > > > > 3. your implementation isn't registered in the container and
> > > > > > therefore
> > > > > > cannot be resolved automatically
>
> > > > > > I haven't used the MembershipProvider explicitly. The apps I create
> > > > > > are intranet apps on a Windows Domain. We utlize windows
> > > > > > authentication, so I'm haven't had to explicitly control the login
> > > > > > process.
>
> > > > > > can you post the relevant code for the provider (and associated
> > > > > > objects)? We should be able to get this to work.
>
> > > > > > On Jan 27, 9:00 am, Sheri <[email protected]> wrote:
>
> > > > > > > Jason, thanks again for your quick answer!
>
> > > > > > > All of component who injects session are transient.
> > > > > > > The only thing that I can guess is "MembershipProvider" in ASP
> > > > > > > .NET
> > > > > > > MVC. I cannot register it as a component. and since I user one of
> > > > > > > my
> > > > > > > services in my costumized provider I should register this one as a
> > > > > > > transient component too but I cannot do.
>
> > > > > > > Is it true? what can I use instead of OoTB "Membership Provider"
> > > > > > > in
> > > > > > > ASP .NET MVC 1.0?
>
> > > > > > > /Sheri
>
> > > > > > > On 26 Jan, 22:32, Jason Meckley <[email protected]> wrote:>
> > > > > > > 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.getCustomerInfoByNam
> > > > > > > > > e
> > > > > > > > > (String username) i
> > > > > > > > > C:\Projects\WebMonitorUpdate\WebMonitorUpdate
> > > > > > > > > \SQLServerServices\OnlineSystemService.cs:rad 33
> > > > > > > > > vid
> > > > > > > > > WebMonitorUpdate.MembershipServicesImpl.SQLServerMembershipProvider.Validat
> > > > > > > > > eUser
> > > > > > > > > (String usernameAndSystemId, String password) i C:\Projects
> > > > > > > > > \WebMonitorUpdate\WebMonitorUpdate\MembershipServicesImpl
> > > > > > > > > \SQLServerMembershipProvider.cs:rad 139
> > > > > > > > > vid
> > > > > > > > > WebMonitorUpdate.MembershipServicesImpl.AccountMembershipService.ValidateUs
> > > > > > > > > er
> > > > > > > > > (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
>
> ...
>
> 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.