Me alegro mucho que haya funcionado Alexandre, perdón por no aprobar este mensaje antes.
Cabe aclarar también que mas allá del DefaultEndMode del atributo
PersistenceConversational que se usa a nivel clase y aplica para todos
los métodos implicitamente, puedes configurarlo explicitamente para
un método en particular. No recuerdo bien pero creo que era así:
[PersistenceConversation(EndMode = EndMode.End)]
public .... Metodo()
{
}
Saludos, y felicitaciones por su español que es excelente [?]
El 18 de octubre de 2011 17:32, Alexandre <[email protected]>escribió:
> Muchas gracias José e Walter!
> Funcionó muy bien!
>
> [PersistenceConversational(MethodsIncludeMode =
> MethodsIncludeMode.Implicit, DefaultEndMode = EndMode.End)]
> public class FornosConsumoService : IFornosConsumoService
>
> Saludos!
>
> On 18 oct, 11:22, José F. Romaniello <[email protected]> wrote:
> > exactamente lo que dijo Walter, podrías usar EndMode.End sobre el metodo
> que
> > busca los datos. Eso te garantiza que al finalizar dicho metodo se cierra
> la
> > sesión.
> > Al volver a llamar el metodo, otra sesión se vuelve a crear.
> >
> > saludos,
> >
> > El 17 de octubre de 2011 22:19, Walter Poch <[email protected]
> >escribió:
> >
> >
> >
> >
> >
> >
> >
> > > Hola,
> >
> > > Mirá desconozco bien el manejo de PersistenceConversational como la
> esta
> > > haciendo, pero lo que recuerdo es que esto manejaba la Unit Of Work (
> > >http://martinfowler.com/eaaCatalog/unitOfWork.html) que en NHibernate
> > > sería la Session.
> >
> > > Lo que te está pasando es porque la Unit Of Work (Session) es la misma
> con
> > > la que estás leyendo los datos antes de cambiar el dato en la DB y
> LUEGO de
> > > cambiar el dato; para que NHibernate se de cuenta debería ser otra
> Session.
> >
> > > En algún momento tus métodos deberían terminar la Unit Of Work (al
> grabar
> > > una entidad o al cancelar los cambios por ejemplo), deberías ver el
> ejemplo
> > > en unhaddins como es su uso. Lamentablemente no puedo ayudarte más ya
> que no
> > > lo utilizo.
> >
> > > Saludos,
> >
> > > El 17 de octubre de 2011 17:33, Alexandre <[email protected]
> >escribió:
> >
> > > Olá Todos!
> >
> > >> Es una aplicación WPF y estoy siguiendo las ideas de
> > >> ChinookMediaManager.
> >
> > >> Tengo un nivel de servicio:
> >
> > >> [PersistenceConversational(MethodsIncludeMode =
> > >> MethodsIncludeMode.Implicit, DefaultEndMode = EndMode.Continue)]
> > >> public class FornosConsumoService : IFornosConsumoService
> > >> {
> > >> private readonly IRepository<RFConsumption>
> > >> rFConsumptionRepository;
> >
> > >> public FornosConsumoService(IRepository<RFConsumption>
> > >> rFConsumptionRepository)
> > >> {
> > >> this.rFConsumptionRepository = rFConsumptionRepository;
> > >> }
> >
> > >> /// <summary>
> > >> /// Consulta consumo por hora (período)
> > >> /// </summary>
> > >> /// <param name="dataHoraInicio"></param>
> > >> /// <param name="dataHoraFim"></param>
> > >> /// <returns></returns>
> > >> public IEnumerable<RFConsumption> ConsultarPorHora(DateTime
> > >> dataHoraInicio, DateTime dataHoraFim)
> > >> {
> > >> try
> > >> {
> > >> var criteria = DetachedCriteria.For<RFConsumption>()
> > >> .Add(Restrictions.Between("CounterDtm",
> > >> dataHoraInicio, dataHoraFim));
> >
> > >> return
> > >> rFConsumptionRepository.GetListCriteria(criteria,
> > >> Order.Desc("CounterDtm"));
> > >> }
> > >> catch (Exception ex)
> > >> {
> > >> Log.Error(Strings.EventNatureFornosConsumo,
> > >> Strings.MessageExceptionConsult, ex);
> > >> throw;
> > >> }
> > >> }
> > >> }
> >
> > >> Tengo un configurador GuyWire
> >
> > >> public class GeneralGuyWire : IGuyWire
> > >> {
> > >> private readonly IConfigurator[] configurators = new
> > >> IConfigurator[]
> > >> {
> > >> new
> > >> NHibernateConfigurator(),
> > >> new
> > >> GUIsConfigurator(),
> > >> new
> > >> RepositoriesConfigurator(),
> > >> new
> > >> ServicesConfigurator()
> > >> };
> >
> > >> private IWindsorContainer container;
> >
> > >> public void Wire()
> > >> {
> > >> try
> > >> {
> > >> if (container != null)
> > >> Dewire();
> >
> > >> container = new WindsorContainer();
> >
> > >> container.AddFacility<FactorySupportFacility>();
> >
> > >> ServiceLocator.SetLocatorProvider(() => new
> > >> WindsorServiceLocator(container));
> >
> > >>
> container.Register(Component.For<IServiceLocator>().Instance(ServiceLocator
> .Current));
> >
> > >> foreach (IConfigurator configurator in configurators)
> > >> configurator.Configure(container);
> > >> }
> > >> catch (Exception ex)
> > >> {
> > >> Log.Error(Strings.EventNatureSystem, "Exceção ao
> > >> configurar aplicação!", ex);
> > >> ShowMessage.Error("Exceção ao configurar aplicação!",
> > >> ex.Message);
> > >> throw;
> > >> }
> > >> }
> >
> > >> public void Dewire()
> > >> {
> > >> Log.Debug(Strings.EventNatureSystem, "Executando...");
> >
> > >> if (container != null)
> > >> container.Dispose();
> > >> }
> > >> }
> >
> > >> public class ServicesConfigurator : IConfigurator
> > >> {
> > >> public void Configure(IWindsorContainer container)
> > >> {
> > >> try
> > >> {
> > >> IEnumerable<Type> DomainServicesInterfaces =
> > >> typeof(IFornosConfiguracaoService).Assembly
> > >> .GetTypes().Where(t => t.IsInterface &&
> > >> t.Namespace.EndsWith("Service"));
> >
> > >> IEnumerable<Type> DomainServices =
> > >> Assembly.Load("PCT.Service").GetTypes()
> > >> .Where(t => t.GetInterfaces().Any(i =>
> > >> DomainServicesInterfaces.Contains(i)));
> >
> > >> foreach (Type domainServicesInterfaces in
> > >> DomainServicesInterfaces)
> > >> foreach (Type domainServices in DomainServices)
> > >> if
> > >> (domainServicesInterfaces.IsAssignableFrom(domainServices))
> > >> {
> > >> Log.Info(Strings.EventNatureSystem,
> > >> "Registrando " + domainServices.Name + "...");
> >
> > >>
> container.Register(Component.For(domainServicesInterfaces).ImplementedBy(do
> mainServices).LifeStyle.Transient);
> > >> }
> > >> }
> > >> catch (Exception ex)
> > >> {
> > >> Log.Error(Strings.EventNatureSystem, "Exceção ao
> > >> registrar serviços!", ex);
> > >> throw;
> > >> }
> > >> }
> > >> }
> >
> > >> public class RepositoriesConfigurator : IConfigurator
> > >> {
> > >> public void Configure(IWindsorContainer container)
> > >> {
> > >> try
> > >> {
> >
> > >>
> container.Register(Component.For(typeof(IRepository<>)).ImplementedBy(typeo
> f(Repository<>)).LifeStyle.Transient);
> > >> }
> > >> catch (Exception ex)
> > >> {
> > >> Log.Error(Strings.EventNatureSystem, "Exceção ao
> > >> registrar repositórios!", ex);
> > >> throw;
> > >> }
> > >> }
> > >> }
> >
> > >> he implementado mi repositorio basado en el siguiente class (Chinook):
> >
> > >> namespace ChinookMediaManager.Data.Impl
> > >> {
> > >> public class Dao<T> : IDao<T>
> > >> {
> > >> protected readonly ISessionFactory Factory;
> >
> > >> public Dao(ISessionFactory factory)
> > >> {
> > >> Factory = factory;
> > >> }
> >
> > >> protected ISession CurrentSession
> > >> {
> > >> get { return Factory.GetCurrentSession(); }
> > >> }
> >
> > >> #region IDao<T> Members
> >
> > >> public T Get(object id)
> > >> {
> > >> return CurrentSession.Get<T>(id);
> > >> }
> >
> > >> ....
> >
> > >> Estoy confundido acerca de la interacción entre unhAddins e
> > >> nHibernate. Creo que la configuración de unhAddins es correcta porque
> > >> se obtienen los datos correctamente en la primera llamada.
> >
> > >> Después de cambiar el valor de un campo (via Toad - BD Oracle), corro
> > >> de nuevo el servicio, pero los datos anteriores siguen siendo los
> > >> mismos en la memoria. Este es el comportamiento de cache de
> > >> nHibernate?
> >
> > >> Gracias
> >
> > >> On 17 oct, 15:42, Walter Poch <[email protected]> wrote:
> > >> > Y que tipo de aplicación es, y como es el despliegue/arquitectura?
> >
> > >> > Si es una app web o los servicios los consumis por WCF/WebServices
> lo
> > >> > recomendado es Session Per Request.
> >
> > >> > Saludos,
> >
> > >> > El 17 de octubre de 2011 13:53, José F. Romaniello
> > >> > <[email protected]>escribió:
> >
> > >> > > La sesión de nhibernate es un cache.
> > >> > > A mi entender, esa implementación del repositorio no debería estar
> > >> atada a
> > >> > > un manejo de sesión, es decir que el ciclo de vida es algo que
> > >> deberías
> > >> > > manejarse a un nivel mas alto.
> >
> > >> > > Como estas manejando el ciclo de vida actualmente? que patrón
> usas?
> >
> > >> > > saludos
> >
> > >> > > El 17 de octubre de 2011 12:30, Alexandre <
> [email protected]
> > >> >escribió:
> >
> > >> > > Hola a todos!
> >
> > >> > >> Estoy usando nHibernate + uNhAddins.
> >
> > >> > >> Mi repositorio es:
> >
> > >> > >> public class Repository<T> : IRepository<T> where T : IEntity
> > >> > >> {
> > >> > >> private readonly ISessionFactory factory;
> >
> > >> > >> protected ISession Session
> > >> > >> {
> > >> > >> get
> > >> > >> {
> > >> > >> return factory.GetCurrentSession();
> > >> > >> }
> > >> > >> }
> >
> > >> > >> public Repository(ISessionFactory factory)
> > >> > >> {
> > >> > >> this.factory = factory;
> > >> > >> }
> >
> > >> > >> public IEnumerable<T> GetListCriteria(DetachedCriteria
> > >> > >> criteria, params Order[] orders)
> > >> > >> {
> > >> > >> return
> RepositoryHelper<T>.GetExecutableCriteria(Session,
> > >> > >> criteria, orders).List<T>();
> > >> > >> }
> >
> > >> > >> class RepositoryHelper<T>
> > >> > >> {
> > >> > >> public static ICriteria GetExecutableCriteria(ISession
> > >> > >> session, DetachedCriteria criteria, Order[] orders)
> > >> > >> {
> > >> > >> ICriteria executableCriteria;
> >
> > >> > >> if (criteria != null)
> > >> > >> executableCriteria =
> > >> > >> criteria.GetExecutableCriteria(session);
> > >> > >> else
> > >> > >> executableCriteria =
> > >> > >> session.CreateCriteria(typeof(T));
> >
> > >> > >> if (orders != null)
> > >> > >> {
> > >> > >> foreach (Order order in
> >
> > ...
> >
> > leer más »
>
> --
> 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<<343.gif>>
