Fiquei tonto escrevendo ASP.NET nos últimos dois dias e sempre quero ser preguiçoso. Como quase todos os métodos no código em segundo plano exigem try..catch, parece muito complicado. Também me lembra o AOP, mas o método do AOP é relativamente complicado e existem muitos métodos. Por exemplo, use Proxy Dinâmico, Atributo ou Emit, etc. De repente pensei no novo recurso do C# 2.0, a delegação anônima, e achei um pouco feio. . . No entanto, na verdade, você também pode simplesmente simular o efeito da AOP de uma forma relativamente leve:
// O requisito para forçar uma classe base de página no asp.net não é excessivo. . .
classe parcial pública TestLogger: PageBase {
protegido void Page_Load(objeto remetente, EventArgs e) {
// Este método é implementado na classe base da página e pode ser implementado nele tratamento geral de exceções, lógica de registro, etc.
TryDo(
// É aqui que as coisas reais são feitas
delegado() {
intuma = 1;
int b = 0;
intc=a/b;
},
// Este é um tratamento de exceção opcional. Se você passar null, a exceção será simplesmente ignorada.
delegado() {
Response.Write("Desculpe, ocorreu um erro.");
}
);
}
}
O código de implementação na classe base da página é muito simples e também pode ser gerenciado de maneira fácil e uniforme. Aqui presumo que simplesmente uso o log4net para registrar exceções:
usando o sistema;
usando System.Web.UI;
usando log4net
SomeNamespace {;
//Defina um delegado simples para passar delegados anônimos
delegado público void MyAction();
//Define a classe base da página
classe pública PageBase: Página {
protected ILog logger;
// Toda a lógica de tratamento de exceções é tratada centralmente na classe base da página.
protegido void TryDo(MyAction doHandler, MyAction exceptHandler) {
tentar {
// Faça algo prático
doHandler();
} catch (Exceção ex) {
//Registro de exceção simples
registrador.Error(ex);
//Algum outro processamento
// . . .
// Chama o tratamento de exceção personalizado, nenhuma informação específica de Exception é retornada aqui. Porque não há necessidade de mostrá-lo ao usuário de qualquer maneira. . .
if (excetoHandler! = nulo)
excetoHandler();
}
}
substituição protegida void OnInit(EventArgs e) {
// Inicialize o logger. Apenas aqui GetType() pode obter o tipo real da subclasse.
registrador = LogManager.GetLogger(this.GetType());
base.OnInit(e);
}
}
}
Ok, vamos parar de escrever aqui. Esta é apenas uma ideia simples minha. O objetivo é implementar o gerenciamento centralizado de exceções ou logs de maneira leve. Claro, isso é incomparável com o conceito AOP completo, mas dito isso, parece que atualmente não existe uma estrutura AOP perfeita no .NET.
http://www.cnblogs.com/RChen/archive/2006/11/16/aspnet_exception_handling.html