Usuário com melhor resposta
Controle de acesso, log e auditoria - não repúdio

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. Reispauloeugenioreis@msn.com
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- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 6 de agosto de 2010 12:10
- Marcado como Resposta Paulo Eugênio Reis sexta-feira, 6 de agosto de 2010 14:03
-
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
- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 6 de agosto de 2010 12:10
- Marcado como Resposta Paulo Eugênio Reis sexta-feira, 6 de agosto de 2010 14:03
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 -
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.
-
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- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 6 de agosto de 2010 12:10
- Marcado como Resposta Paulo Eugênio Reis sexta-feira, 6 de agosto de 2010 14:03
-
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
- Sugerido como Resposta AndreAlvesLimaModerator sexta-feira, 6 de agosto de 2010 12:10
- Marcado como Resposta Paulo Eugênio Reis sexta-feira, 6 de agosto de 2010 14:03
-
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.