Gracias Juan

Habia llevado el codigo que tenia antes hacia un ActionFilter, y el
resultado fue el mismo, claro no habia implementado nada de lo que tu
me indicas para los errores, estoy verificando OnResultExecuted el
parametro filterContext, y me parece que este
tambien podria utilizarlo para verificar alguna exception, y con esto
hacer commit o rollback

Creo que con esto y otros argumentos que se han planteado en hilos
pasados, volcare todo mi codigo a ActionFilter

Gracias a todos nuevamente, solo me queda la incertidumbre de saber si
he implementado bien session per request y si este es su
comportamiento normal (como lo menciono en el correo anterior)

Saludos

Edgar

El día 20 de julio de 2010 03:57, Juan Cuello <[email protected]> escribió:
> 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

-- 
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