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(domainServices).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(typeof(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 orders)
> >>                    executableCriteria.AddOrder(order);
> >>            }
>
> >>            return executableCriteria;
> >>        }
> >>    }
> >> }
>
> >> Mi servicio es:
>
> >>                var criteria = DetachedCriteria.For<RFConsumption>()
> >>                    .Add(Restrictions.Between("CounterDtm",
> >> dataHoraInicio, dataHoraFim));
>
> >>                return
> >> rFConsumptionRepository.GetListCriteria(criteria,
> >> Order.Desc("CounterDtm"));
>
> >> Cuando se ejecuta el servicio por primera vez, los datos se devuelven
> >> correctamente, pero si modifico el valor de un campo directamente en
> >> la base de datos con otra aplicación, el nuevo valor no se devuelve
> >> por NHibernate.
>
> >> Si cambio el depósito:
>
> >>        protected ISession Session
> >>        {
> >>            get
> >>            {
> >>                factory.GetCurrentSession().Clear();
> >>                return factory.GetCurrentSession();
> >>            }
> >>        }
>
> >> valor modificado por otra aplicación siempre se devuelve.
>
> >> ¿cuál es la mejor manera de implementar el repositorio?
>
> >> Creo que Session.Clear no es la mejor manera de resolver esta
> >> cuestión, ya que estoy usando uNhAddins en mi capa de servicio.
>
> >> Gracias
>
> >> --
> >> 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
>
> --
> Saludos,
>
> Walter G. Poch
> Sr. .Net Developer
> --------------------------------------------
> Cell: +54 (9 341) 3353273
> [email protected]

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