Gracias Fabio

En un curso me dijeron lo siguiente, no porque la herramienta te
permite hacer tal cosa, quiere decir que sea correcto...
Las preguntas que me planteas, son las mismas que en su momento mes
las hice y por medio de googlear me llevaron a nhibernate y a este
foro, hoy con los proyectos nuevos que tengo, estoy tratando de hacer
las cosas bien, es decir siguiendo metodologias, patrones de diseño y
aprendiendo a utilizar framework (nh, castle, etc) e investigando
claro esta

nuevamente gracias por todo



El día 21 de enero de 2010 11:19, Fabio Maulo <[email protected]> escribió:
> bueno... si eso significa "un solo paso" y eso eso lo que te gusta seguí los
> links que mandó Angel (AJL) ya que son para trabajar con StoredProcedures.
> En este foro, es probable, que vas a encontrar poca ayuda sobre como
> trabajar con NH+SP exactamente porque quien trabaja con ORM trata de evitar
> meter logica de negocio en las SPs.
> Te hago otras preguntas:
> Como estas probando que esas SPs hacen exactamente lo que tienen que hacer ?
> Tenes un programa o algo "computerizado" que pruebe que cada SP se "porte
> bien" ?
> Si te piden de cambiar RDBMS contestá "no se puede", te pegas un tiro, o le
> facturas un fangote ?
> Cuanto programadores C# tenes y cuanto programadores de SPs tenes ?
> Cuanto te sale un programador C#  y cuanto te sale un programador de SPs ?
> Que seguridad te da una SP que no te de un metodo de una clase ?
> Es mas rapido escribir una SP o uno o n metodos de clases C# ?
> Si mucha logica de negocio se ejecuta en la misma PC donde está el DB,
> cuanto escalable es tu applicación ?
> Cuanto cuesta agregar potencia de procesamiento a un server-DB y cuanto
> cuesta agregar un WEB-server ?
> Tengo otras, pero con estas creo que tenes para pensar un rato.
>
> El 21 de enero de 2010 11:51, Edgar Ramos <[email protected]> escribió:
>>
>> Gracias a todos, se lee la ciencia, incribirme en este foro ha sido lo
>> mejor que hecho
>>
>> Bueno vamos por partes
>>
>> Fabio, de un solo paso, en resumen, mando a mi store procedure los
>> parametros necesarios y este internamente manejando transacciones,
>> actualiza, elimina, inserta en fin hace varias cosas, un ejemplo
>> seria, trabajo en un hotel , el cliente hace check-out, cancelo su
>> folio (cuenta), actualizo el estado del huesped a "huesped salio",
>> actualizo el estado de la habitacion a "habitacion sucia", en fin
>> varias cosas realacionadas en un solo store procedure
>>
>> Carlos y Jose, mil gracias por compartir sus conocimientos, si
>> efectivamente soy nuevo, pero que eso no les detenga, quiero ser bueno
>> asi que tengo que aprender de los buenos, si hay que leer, investigar,
>> lo hago con mucha ganas, durante mi vida he desarrollado software de
>> forma estructurada, el paso a POO, me ha costado pero sigo en la
>> lucha, pero no desmayo
>>
>> al leer sus posts, tengo la pauta de ir a consultar en internet mas
>> sobre estos temas, por ejemplo DDD, DomainEvent, patrones de diseño,
>> GRASP, etc
>>
>> gracias nuevamente
>>
>>
>>
>> El día 21 de enero de 2010 06:23, José F. Romaniello
>> <[email protected]> escribió:
>> > Si, ahora me di cuenta y tenes razón. Perdón si parece abrumadora la
>> > otra
>> > explicación
>> >
>> > El 21 de enero de 2010 07:54, Carlos Peix <[email protected]>
>> > escribió:
>> >>
>> >> Hola Jose,
>> >> Estoy de acuerdo con vos, solo me gustaria que releas el primer post de
>> >> Edgar.
>> >> Puedo equivocarme pero entendi que el recien esta empezando con este
>> >> tipo
>> >> de diseño y juzgue que proponer un patron visitor lo asustaria o le
>> >> haria
>> >> mas dificil un primer paso. Mucho menos se me ocurriria apuntarlo al
>> >> blog de
>> >> Udi (con el cual estoy de acuerdo, sobre todo con DomainEvents).
>> >> Entiendo que para la mayoria de la audiencia de esta lista mi propuesta
>> >> parece juego de niños pero vale la pena, ya veran cuando dentro de un
>> >> par de
>> >> años Edgar nos solucione los problemas a nosotros o a otros :-).
>> >> De todas maneras esta bueno que tenga alternativas para elegir.
>> >> Un abrazo
>> >> ----------------------------------
>> >> Carlos Peix
>> >>
>> >> 2010/1/21 José F. Romaniello <[email protected]>
>> >>>
>> >>> No me gusta esta arquitectura Carlos.
>> >>> Para mi el servicio que lleva a cabo el caso de uso de dar de alta una
>> >>> venta tiene que terminar grabando una venta con su repositorio. Tal
>> >>> vez el
>> >>> movimiento de stock, es un agregado de la misma venta, pero para este
>> >>> caso
>> >>> voy a suponer que no.
>> >>> Hace un tiempo escribí sobre un dominio "parecido" ;)
>> >>>
>> >>>
>> >>> http://jfromaniello.blogspot.com/2009/11/caso-practico-patron-visitor.html
>> >>>
>> >>> Mi idea es que e
>> >>> public class RegistroDeVentas
>> >>> {
>> >>>    IVisitor<Venta> visitors;
>> >>>    public RegistroDeVentas(IVisitor<Venta>...visitors,
>> >>> IRepositorioVenta
>> >>> repVenta) {
>> >>>    }
>> >>>   public RegistrarVenta(Venta venta)
>> >>>   {
>> >>>     foreach (var visitor in visitors)
>> >>>     {
>> >>>       if(visitor.EsAplicable(venta))
>> >>>           visitor.Aplicar(venta)
>> >>>     }
>> >>>     repVenta.Guardar(venta)
>> >>>   }
>> >>> }
>> >>> La interfaz IVisitor tiene solo esos dos metodos que aparecen ahí, en
>> >>> la
>> >>> configuración del container digo que visitors se aplican para este use
>> >>> case.
>> >>> Un ejemplo de visitor para Movimiento Stock sería
>> >>> public class AplicadorDeStockPorVentas : IVisitor<Venta>
>> >>> {
>> >>>    public  AplicadorDeStockPorVentas(IRepositorioStock repStock){
>> >>> repStock = ...}
>> >>>    public bool EsAplicable(Venta venta)
>> >>>    {
>> >>>        return venta.TipoDeVenta.MueveStockFisico &&
>> >>> venta.EntregaInmediata
>> >>>    }
>> >>>    public void Aplicar(Venta venta)
>> >>>    {
>> >>>      foreach(var linea in venta.Lineas)
>> >>>      {
>> >>>         var movStock = new MovimientoStock(linea.Articulo,
>> >>> linea.Cantidad, Signo.Debito);
>> >>>         repStock.Guardar(movStock);
>> >>>      }
>> >>>    }
>> >>> }
>> >>> Me encanta este tipo de código por que es muy facil testearlo.
>> >>> Si bien en su momento estaba convencido ahora me copa mas la idea de
>> >>> DomainEvents, igual, el código me queda muy similar.
>> >>> Yo uso la misma implementación de Udi, solamente que con
>> >>> ServiceLocator,
>> >>> y en vez de ser todo estática la clase DomainEvents, tengo un
>> >>> IDomainEvents
>> >>> (o IDomainEventsManager el cual inyecto en los servicios)
>> >>> http://www.udidahan.com/2009/06/14/domain-events-salvation/
>> >>>
>> >>> El 21 de enero de 2010 00:13, Carlos Peix <[email protected]>
>> >>> escribió:
>> >>>>
>> >>>> Hola Edgard,
>> >>>> Creo que deberias mirar codigo escrito por otros para tener una
>> >>>> vision
>> >>>> global. Aunque no adhiero 100% a los detalles de esta arquitectura,
>> >>>> podrias
>> >>>> mirar esto: http://code.google.com/p/sharp-architecture/
>> >>>> No obstante, te dejo aqui algo esquematico (no me critiquen por
>> >>>> favor,
>> >>>> abajo aclaro como profesionalizar este codigo :-) ).
>> >>>> Supongamos que tenes una clase que representa la venta:
>> >>>> public class Venta {
>> >>>>    IList<LineaVenta> lineas;
>> >>>> }
>> >>>> y otra que representa a un movimiento de stock
>> >>>> public class MovimientoStock {
>> >>>>    IList<LineaMovimientoStock> lineas;
>> >>>> }
>> >>>> Luego se me ocurre una suerte de servicio o de componente cuya
>> >>>> responsabilidad sea aplicar la venta contra el stock:
>> >>>> public class AplicadorDeVentaAStock {
>> >>>>    public MovimientoStock AplicarVenta(Venta venta) {
>> >>>>       // aqui va la logica por la cual se aplica la venta y se CREA
>> >>>>       // un objeto MovimientoStock
>> >>>>       return movimientoStock;
>> >>>>    }
>> >>>> }
>> >>>> Como veras, hasta aqui no hay nada de persistencia, solo logica de
>> >>>> negocio.
>> >>>> Veamos ahora como interviene la persistencia: seguramente un usuario
>> >>>> presionara un boton cuando quiere grabar la venta, en el codigo de
>> >>>> ese boton
>> >>>> deberia llamarse a un objeto (un servicio o fachada de aplicacion)
>> >>>> cuya
>> >>>> responsabilidad sea registrar la venta:
>> >>>> public class RegistroDeVentas {
>> >>>>    public void Registrar(Venta venta) {
>> >>>>       MovimientoStock movimientoStock
>> >>>> = aplicadorDeVentaAStock.AplicarVenta(venta);
>> >>>>       repositorioVenta.Save(venta);
>> >>>>       repositorioMovimientoStock.Save(movimientoStock);
>> >>>>    }
>> >>>> }
>> >>>> Es sencillo no? la version real no tiene que ser mas compleja pero
>> >>>> creo
>> >>>> que es necesario dar algunas pautas y aclaraciones.
>> >>>> De donde salen aplicadorDeVentaAStock, repositorioVenta
>> >>>> y repositorioMovimientoStock en el metodo Registrar? es aqui donde
>> >>>> aparece
>> >>>> injeccion de dependencias o DI, no voy a configurar todo eso pero si
>> >>>> voy a
>> >>>> sugerir el contructor de la clase RegistroDeVentas:
>> >>>> public class RegistroDeVentas {
>> >>>>    IAplicadorDeVentaAStock aplicadorDeVentaAStock;
>> >>>>    IRepositorioVenta repositorioVenta;
>> >>>>    IRepositorioMovimientoStock repositorioVenta;
>> >>>>
>> >>>>
>> >>>> public RegistroDeVentas(IAplicadorDeVentaAStock aplicadorDeVentaAStock,
>> >>>>                                         IRepositorioVenta
>> >>>> repositorioVenta,
>> >>>>
>> >>>>  IRepositorioMovimientoStock repositorioVenta) {
>> >>>>       this.aplicadorDeVentaAStock = aplicadorDeVentaAStock;
>> >>>>       this.repositorioVenta = repositorioVenta;
>> >>>>       this.repositorioMovimientoStock = repositorioMovimientoStock;
>> >>>>    }
>> >>>> }
>> >>>> Estas instancias seran "injectadas" en esta fachada de servicio por
>> >>>> un
>> >>>> container, por ejemplo, Windsor.
>> >>>> Alguno que todavia este despierto notara que use el
>> >>>> tipo IAplicadorDeVentaAStock para el aplicador de stock, esto nos
>> >>>> permitira,
>> >>>> dependiendo de las preferencias de nuestro cliente, utilizar
>> >>>> distintas
>> >>>> estrategias de aplicacion de stock. Esto es el patron Strategy.
>> >>>> Por supuesto que tambien debe iniciarse transacciones asociadas a los
>> >>>> repositorios, tambien puede hacerse mediante configuracion.
>> >>>> Creo que con este esquemas tenes algo sencillo que puede servir para
>> >>>> aclararte el panorama al tiempo que, con las aclaraciones que agregue
>> >>>> mas un
>> >>>> poco de investigacion de tu parte llegar a algo bastante profecional,
>> >>>> extensible y testeable.
>> >>>> Un saludo.
>> >>>> PD: Pierde Boca, gana River :-(
>> >>>> ----------------------------------
>> >>>> Carlos Peix
>> >>>>
>> >>>> 2010/1/20 Edgar Ramos <[email protected]>
>> >>>>>
>> >>>>> Gracias por los comentarios, antes manejaba toda esta logica con
>> >>>>> store
>> >>>>> procedures y triggers, hoy requiero hacerlo de la forma correcta,
>> >>>>> Carlos tu punto de vista me ha quedado gustando, algun link donde
>> >>>>> profundizar seria bienvenido
>> >>>>>
>> >>>>>
>> >>>>> saludos
>> >>>>>
>> >>>>> El día 20 de enero de 2010 15:46, Carlos Peix
>> >>>>> <[email protected]>
>> >>>>> escribió:
>> >>>>> > Diego,
>> >>>>> > Para que veas que soy un caballero: yo no disiento con vos. :-)
>> >>>>> > Por supuesto que Diego tiene razon pero, conceptualmente, lo que
>> >>>>> > señala es
>> >>>>> > el equivalente a un store procedure (mas precisamente un trigger)
>> >>>>> > escrito en
>> >>>>> > C#.
>> >>>>> > Puede funcionar pero no es recomendable en un diseño nuevo, desde
>> >>>>> > cero. Al
>> >>>>> > menos en mi opinion.
>> >>>>> > ----------------------------------
>> >>>>> > Carlos Peix
>> >>>>> >
>> >>>>> > 2010/1/20 Diego Mijelshon <[email protected]>
>> >>>>> >>
>> >>>>> >> Disiento con Carlos respecto de si es _posible_ hacer esto,
>> >>>>> >> aunque
>> >>>>> >> estoy
>> >>>>> >> de acuerdo en que no es un muy buen diseño.
>> >>>>> >> Para lograr algo así, podrías usar un PostInsertEventListener que
>> >>>>> >> haga la
>> >>>>> >> actualización.
>> >>>>> >> Algo más o menos así (no testeado):
>> >>>>> >> void OnPostInsert(PostInsertEvent @event)
>> >>>>> >> {
>> >>>>> >>   var linea = @event.Entity as Linea;
>> >>>>> >>   if (linea != null)
>> >>>>> >>    �[email protected]("update Producto set Stock = Stock
>> >>>>> >> -
>> >>>>> >> :cantidad where Id = :idProducto")
>> >>>>> >>       .SetParameter("cantidad", linea.Cantidad)
>> >>>>> >>       .SetParameter("idProducto", linea.Producto.Id)
>> >>>>> >>       .ExecuteUpdate()
>> >>>>> >> }
>> >>>>> >> Así y todo, estarías usando un event listener, que es una
>> >>>>> >> herramienta de
>> >>>>> >> infraestructura de NHibernate para un concern específico de
>> >>>>> >> negocio,
>> >>>>> >> lo cual
>> >>>>> >> tiene bastante mal olor.
>> >>>>> >>
>> >>>>> >>    Diego
>> >>>>> >>
>> >>>>> >>
>> >>>>> >> 2010/1/20 Edgar Ramos <[email protected]>
>> >>>>> >>>
>> >>>>> >>> Saludos a todos
>> >>>>> >>>
>> >>>>> >>> Como ejemplo similar el siguiente
>> >>>>> >>>
>> >>>>> >>> Tengo estas entidades, Venta, Linea (detalle de la venta), y
>> >>>>> >>> Producto
>> >>>>> >>> (con su stock), y requiero hacer lo siguiente
>> >>>>> >>>
>> >>>>> >>> Al momento de crear Una venta e ingresar su Detalle (Linea), me
>> >>>>> >>> actualice el stock de cada uno de los productos (de Linea),
>> >>>>> >>> basicamente stock=stock-(cantidad digitada)
>> >>>>> >>>
>> >>>>> >>> Puedo hacer esto ?
>> >>>>> >>>
>> >>>>> >>> Cualquier comentario es bienvenido
>> >>>>> >>>
>> >>>>> >>> Gracias nuevamente
>> >>>>> >>>
>> >>>>> >>> --
>> >>>>> >>> 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
>> >>
>> >>
>> >> --
>> >> 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
>
>
>
> --
> Fabio Maulo
>
>
> --
> 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