none
Ajuda em como registrar Eventos no NHibernate com ActiveRecord RRS feed

  • Pergunta

  • Ola pessoal

    Preciso registrar eventos no NHibernate para geração de auditoria das minhas entidades. Ja revirei a net e não consegui informações suficiente para entender como se registra tais eventos. Alguém poderia me dar uma luz?
    sexta-feira, 15 de janeiro de 2010 17:10

Respostas

Todas as Respostas

  • Fala Márcio,

    Veja se chegou a ver isso:

    http://codeprairie.net/blogs/chrisortman/archive/2008/04/09/hooking-into-new-nhibernate-features-from-castle-activerecord.aspx


    Forte abraço,

    André Borges Medeiros
    MCT, MCPD, MCTS

    >> Se a resposta solucionar sua dúvida, favor Votar como Útil
    sexta-feira, 15 de janeiro de 2010 18:36
  • Obrigado pelo ajuda Andre fiz uma rotima para testes aqui mas não consegui fazer funcionar veja como eu implementei:

    namespace Prototipo
    {

        public static class _sclRegistroEvento
        {
            public static void RegistrarEvento()
            {
                IConfigurationSource source = ConfigurationSettings.GetConfig("activerecord") as IConfigurationSource;

                ActiveRecordStarter.SessionFactoryHolderCreated += (holder) =>
                {
                    holder.OnRootTypeRegistered += (sender, rootType) =>
                    {
                        var mholder = sender as ISessionFactoryHolder;
                        var nhConfig = mholder.GetConfiguration(rootType);
                        nhConfig.EventListeners.PreUpdateEventListeners =
                        new NHibernate.Event.IPreUpdateEventListener[] { new _clAuditoria() };
                    };
                };            
            }
        }


        class _clAuditoria : IPreUpdateEventListener
        {

            protected StreamWriter ArquivoLog;
            protected string Arquivo = @"D:\Auditoria.Txt";

            public _clAuditoria()
            {
                ArquivoLog = new StreamWriter(Arquivo, true);
            }


            bool IPreUpdateEventListener.OnPreUpdate(PreUpdateEvent @event)
            {
                string strClasse = @event.Entity.GetType().FullName;
                string strEstado = @event.State[0].ToString();
                string strLog;

                strLog = "Entidade: " + strClasse + "   Estado: " + strEstado;

                ArquivoLog.WriteLine(strLog);
                ArquivoLog.Flush();
                ArquivoLog.Close();

                return false;

            }

        }

    Criei uma classe bem simples para testar veja:


        [ActiveRecord("tblDepartamentos")]
        public class _clDepartamento: ActiveRecordBase<_clDepartamento>
        {
            private int      _idDepartamento;
            private string   _nmDepartamento;
            private string   _nmGerente;
            private DateTime _dtCriacao;
            private double   _vlTotalFuncionarios;

            [PrimaryKey(PrimaryKeyType.Assigned)]
            public int idDepartamento
            {
                get { return _idDepartamento; }
                set { _idDepartamento = value; }
            }
           
            [Property]
            public string nmDepartamento
            {
                get { return _nmDepartamento; }
                set { _nmDepartamento = value; }
            }

            [Property]
            public string nmGerente
            {
                get { return _nmGerente; }
                set { _nmGerente = value; }
            }

            [Property]
            public DateTime dtCriacao
            {
                get { return _dtCriacao; }
                set { _dtCriacao = value; }
            }

            [Property]
            public double vlTotalFuncionarios
            {
                get { return _vlTotalFuncionarios; }
                set { _vlTotalFuncionarios = value; }
            }
       }

    A idéia é quando eu criar o objeto Departamento e chamar o método create do AR, ele grave no arquivo D:\Auditoria.Txt as mudanças que foram feitas no objeto.
    Mas isso não deu certo, o que estou fazendo de errado?
    segunda-feira, 18 de janeiro de 2010 17:08