none
Controle de acesso, log e auditoria - não repúdio RRS feed

  • Pergunta

  • Bom dia pessoal,

    Estou desenvolvendo o sistema de não repúdio aqui da empresa, o log de negócios foi tranquilo utilizando a biblioteca Doddle.

    O log de rastreabilidade é que estou tendo uma certa dificuldade, pois tenho que guardar a informação quando o form é aberto e fechado, queria fazer isso de forma transparente, onde que não seria necessário o programador colocar nenhuma linha de código nos eventos Load ou FormClosed dos forms, qual seria a melhor forma de proceder.

    Agradeço antecipadamente,


    Paulo Eugênio S. Reis
    pauloeugenioreis@msn.com
    segunda-feira, 2 de agosto de 2010 13:10

Respostas

  • Paulo,

    A segunda opção (AOP) realiza a criação de código IL.

    Não cheguei a testar aqui, mas no PostSharp por exemplo é possível decorar um assembly e atribuir aspectos sobre os tipos definidos no mesmo, possibilitando então realizar o log (veja aqui). O problema é que o PostSharp não é free, talvez você encontre essa mesma funcionalidade em outros frameworks (Aspect .NET, Castle Windsor, Spring .NET e outros).

    Talvez os outros colegas do fórum também tenham outras sugestões.

    Att.

    Ari C. Raimundo
    MCAD, MCTS
    http://araimundo.blogspot.com

    terça-feira, 3 de agosto de 2010 13:17
    Moderador
  • Paulo,

    Concordo com o Ari... neste caso AOP é a saída.

    Acho que esse artiguinho consegue te dar uma idéia de como funciona no Spring.Net. Existem outras frameworks. O exemplo é baseado em Web, mas pode ser adaptado para Windows.Forms.

    http://ericlemes.com/2009/10/23/dotnet-spring-pt4/

     

    Abraço,

    Eric

    sexta-feira, 6 de agosto de 2010 12:09

Todas as Respostas

  • Paulo,

    Uma alternativa é criar uma classe que herda de Form e que sobrescreve os métodos OnLoad e OnFormClosed. Assim, os seus desenvolvedores poderiam herdar dessa classe na criação dos formulários. Por exemplo:

    public class FormBase : Form
    {
        protected override void OnLoad(EventArgs e)
        {           
            base.OnLoad(e);
            // faça o log aqui...
        }

        protected override void OnFormClosed(FormClosedEventArgs e)
        {           
            base.OnFormClosed(e);
            // faça o log aqui...
        }
    }

    Uma outra opção seria utilizar AOP e decorar o assembly interceptando os métodos/eventos acima citados.

    Espero ter ajudado.

    Att.

    Ari C. Raimundo
    MCAD, MCTS
    http://araimundo.blogspot.com

    terça-feira, 3 de agosto de 2010 02:20
    Moderador
  • Pensei nessa possibilidade, mais ficaria dependente do programador que não poderá esquecer de utilizar sempre aquele template de form ou nao esquecer de mudar a classe base.

    Alguém sabe se poderia utilizar uma manipulação de bytecode, ou fazer algo em tempo de execução, pois necessariamente seria obrigatorio esse log nos metodos Load e FormClosed dos forms. 

    terça-feira, 3 de agosto de 2010 11:51
  • Paulo,

    A segunda opção (AOP) realiza a criação de código IL.

    Não cheguei a testar aqui, mas no PostSharp por exemplo é possível decorar um assembly e atribuir aspectos sobre os tipos definidos no mesmo, possibilitando então realizar o log (veja aqui). O problema é que o PostSharp não é free, talvez você encontre essa mesma funcionalidade em outros frameworks (Aspect .NET, Castle Windsor, Spring .NET e outros).

    Talvez os outros colegas do fórum também tenham outras sugestões.

    Att.

    Ari C. Raimundo
    MCAD, MCTS
    http://araimundo.blogspot.com

    terça-feira, 3 de agosto de 2010 13:17
    Moderador
  • Paulo,

    Concordo com o Ari... neste caso AOP é a saída.

    Acho que esse artiguinho consegue te dar uma idéia de como funciona no Spring.Net. Existem outras frameworks. O exemplo é baseado em Web, mas pode ser adaptado para Windows.Forms.

    http://ericlemes.com/2009/10/23/dotnet-spring-pt4/

     

    Abraço,

    Eric

    sexta-feira, 6 de agosto de 2010 12:09
  • Bom dia,

     

    Realmente eu tenho que utilizar AOP, fiz uma implementação utilizando o Framework PostSharp.

    A minha maior preocupação era de ficar dependente que o programador decorasse o método, ou não esquecesse de mudar a classe base. Abaixo segue como utilizei pra não ter essa dependência do programador e ficar de forma transparente.

     

    Classe Log Rastreabilidade:

      [Serializable]
      public sealed class LogRastreabilidadeAttribute : OnMethodBoundaryAspect
      {
        private string methodName;
    
        public override void CompileTimeInitialize(System.Reflection.MethodBase method, AspectInfo aspectInfo)
        {
          this.methodName = method.DeclaringType.FullName + "." + method.Name;
        }
    
        public override void OnEntry(MethodExecutionArgs args)
        {
          switch (methodName)
          {
            case "System.Windows.Forms.Control.Show":
              System.Diagnostics.Trace.WriteLine("Log");
              break;
            case "System.Windows.Forms.Form.Dispose":
              System.Diagnostics.Trace.WriteLine("Log");
              break;
            default:
              break;
          }
        }
      }

     

    No Arquivo Program.cs adicionei a decoração:

    [assembly: AutorizacaoTeste.LogRastreabilidade(AttributeTargetAssemblies = "System.Windows.Forms", AttributeTargetTypes = "System.Windows.Forms.*")]

    Toda vez que um Form for aberto ou fechado ele grava as informações, e de forma transparente, na classe log rastreabilidade utilizei o switch para verificar qual método esta sendo chamado.

     

     

     

    sexta-feira, 6 de agosto de 2010 14:00