Y en lugar de usar session-per-request, estando con MVC, por qué no
pruebas con ActionFilters?

Creo que se tiene más control de la transacción. A veces, puede que
hagas un SaveOrUpdate y no de error, pero al hacer el commit te puede
fallar.

Si utilizas Session-per-request tienes poco control de lo que puedes
hacer el finalizar el request. En cambio, si usas actionfilters de
MVC, especificas en el controller el atributo [HandleError] y podrías
hacer lo que quisieras sobreescribiendo el método del controlador
llamado OnException. Ahí podrías devolver al navegador errores en
JSON, mostrar una vista que dé un error, especificar el error en la
vista actual, etc.

El ActionFilter es un atributo que sería algo así:

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public class DataSessionCallAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext
filterContext)
        {
            Inicia_Session_Transaccion();
         }

        public override void OnResultExecuted(ResultExecutedContext
filterContext)
        {
            Fin_Session_Transaccion();
        }
    }

Y tendrías la vida de la sesión durante la ejecución de un método del
Controlador.

Yo utilizo esta técnica y también con interceptors.


On 19 jul, 23:14, Edgar Ramos <[email protected]> wrote:
> Gracias nuevamente a todos
>
> Puse en practica algo similar a lo que me comentas José, y
> efectivamente como resultado final, en el orden siguiente
> 1.- retorno a la vista el objeto con los mensajes de error
> 2.- se ejecuta Application_EndRequest, y con ello se ejecuta la linea
> del Commit();
> 3.- Mi objeto que en primera instancia no paso la validacion, tampoco
> fue cambiado en la base de datos, con datos no validos
>
> Pregunta: que hizo el Commit() ?, volvio a persistir mi objeto valido
> ?, aparentemente hizo commint, pero como no habia nada que permanezca
> en save de la session, pues finalmente no hizo nada ?, o
> difinitivamente no tengo que preocuparme porque este es el proceso
> normal ?
>
> Edgar
>
> El día 19 de julio de 2010 13:24, José F. Romaniello
> <[email protected]> escribió:
>
>
>
> > Ahora estamos hablando de otra cosa:
> > suponiendo que vos tenes un action como Save
> > public void Save(ViewModel viewModel)
> > {
> >   if(ModelState.IsValid)
> >   {
> >     hacer algo para continuar guardando. viewModel
> >     return View....Siguient.
> >   }
> >   return View(viewModel);
> > }
> > Lo único que tienes que hacer es implementar IDataErrorInfo en el viewmodel,
> > y creo que en la versión 2.0 si usas DataAnnotations no hace falta nada más.
> > Conclusión final, controller, Asp.Net MVC, ViewModel, etc.... control de
> > excepciones... donde juega NHibernate en la pregunta?
>
> > El 19 de julio de 2010 15:16, Edgar Ramos <[email protected]> escribió:
>
> >> Gracias Gustavo
>
> >> Pecando nuevamente de novato, como logro por un lado regresar a la
> >> vista mi objeto invalido (para que pueda ser visualizado con sus
> >> errores)
> >> y como logro que este objeto ivalido no sea persistido.
>
> >> A lo mejor estan sencillo y yo lo complico demasiado
>
> >> Saludos
>
> >> Edgar
>
> >> El día 19 de julio de 2010 12:58, Gustavo Ringel
> >> <[email protected]> escribió:
> >> > Edgar, si haces return adentro del catch, absorbiste el throw o sea que
> >> > en
> >> > tu vida vas a llegar a la excepcion de tu session manager, a menos que
> >> > "tengas suerte" y return View(objeto) de una excepcion :).
> >> > Gustavo.
>
> >> > 2010/7/19 Edgar Ramos <[email protected]>
>
> >> >> En mi pequeño ejemplo de una aplicacion asp net mvc + nh 2.1, he
> >> >> implementado IHttpModule, pero tengo una duda,
> >> >> en mi controller tengo lo siguiente
>
> >> >> try {
> >> >>  //codigo que puede lanzar una exception
> >> >> }
> >> >> catch (Exception) {
> >> >>    return View(objeto);
> >> >> }
>
> >> >> si por cualquier motivo entra al catch , el codigo abajo descrito
> >> >> Application_EndRequest(), es suficiente para que haga un Rollback() ?,
> >> >> este
> >> >> sería automatico ?, o tengo que implementar algo adicional ?
>
> >> >> Por un lado el patron me dice por cada request una session, noto que
> >> >> en mi ejemplo eso lo esta haciendo, pero por otro lado la parte ACID,
> >> >> con el unit of work , no me esta funcionando, o la verdad ya estoy
> >> >> confundido, si tengo que leer en español o en ingles, cualquier link,
> >> >> pdf, lo que sea me es bienvenido
>
> >> >> private void Application_EndRequest(object sender, EventArgs e) {
>
> >> >>            ISession session = CurrentSessionContext.Unbind(
> >> >>            ServiceLocator.Current.GetInstance<ISessionFactory>());
>
> >> >>             try {
>
> >> >>                    if (session.Transaction.IsActive) {
> >> >>                        session.Transaction.Commit();
> >> >>                    }
>
> >> >>                }
> >> >>                catch (Exception) {
> >> >>                    if (session.Transaction.IsActive) {
> >> >>                        session.Transaction.Rollback();
> >> >>                    }
>
> >> >>                    throw;
>
> >> >>                }
> >> >>                finally {
> >> >>                    session.Close();
> >> >>                }
> >> >>        }
>
> >> >> Saludos
>
> >> >> Edgar
>
> >> >> PD: Me sugirieron hacer unos test, pero recien estoy entrando a ese
> >> >> mundo,
>
> >> >> --
> >> >> Para escribir al Grupo, hágalo a esta dirección:
> >> >> [email protected]
> >> >> Para más, visite:http://groups.google.com/group/NHibernate-Hispano
>
> >> > --
> >> > Para escribir al Grupo, hágalo a esta dirección:
> >> > [email protected]
> >> > Para más, visite:http://groups.google.com/group/NHibernate-Hispano
>
> >> --
> >> Para escribir al Grupo, hágalo a esta dirección:
> >> [email protected]
> >> Para más, visite:http://groups.google.com/group/NHibernate-Hispano
>
> > --
> > Para escribir al Grupo, hágalo a esta dirección:
> > [email protected]
> > Para más, visite:http://groups.google.com/group/NHibernate-Hispano

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a