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