He estado mareado escribiendo ASP.NET durante los últimos dos días y siempre quiero ser vago. Dado que casi todos los métodos en el código de fondo requieren try..catch, parece muy engorroso. También me recuerda a AOP, pero el método de AOP es relativamente complicado y existen muchos métodos. Por ejemplo, utilice proxy dinámico, atributo o emisión, etc. De repente pensé en la nueva característica de C# 2.0, la delegación anónima, y pensé que era un poco fea. . . Sin embargo, de hecho, también puede simplemente simular el efecto de AOP de una manera relativamente liviana:
// El requisito de forzar una clase base de página en asp.net no es excesivo. . .
clase parcial pública TestLogger: PageBase {
Page_Load vacío protegido (remitente del objeto, EventArgs e) {
// Este método se implementa en la clase base de la página y en él se puede implementar el manejo general de excepciones, la lógica de registro, etc.
Intenta hacerlo (
// Aquí es donde se hacen las cosas reales
delegado() {
int a = 1;
int b = 0;
intc = a/b;
},
// Este es un manejo de excepciones opcional. Si pasa nulo, la excepción simplemente se ignorará.
delegado() {
Response.Write("Lo sentimos, ocurrió un error.");
}
);
}
}
El código de implementación en la clase base de la página es muy simple y también se puede administrar de manera fácil y uniforme. Aquí asumo que simplemente uso log4net para registrar excepciones:
usando Sistema;
utilizando System.Web.UI;
usando log4net;
espacio de nombres SomeNamespace {
//Definir un delegado simple para pasar delegados anónimos
delegado público void MyAction();
//Definir clase base de página
clase pública PageBase: Página {
protected ILog logger;
// Toda la lógica de manejo de excepciones se maneja centralmente en la clase base de la página.
void protegido TryDo(MiAcción doHandler, MiAcción exceptoHandler) {
intentar {
// Haz algo práctico
hacerHandler();
} captura (Excepción ex) {
//Registro de excepciones simple
registrador.Error(ex);
// Algún otro procesamiento
// . . .
// Llame al manejo de excepciones personalizado, aquí no se devuelve información específica de la excepción. Porque de todos modos no es necesario mostrárselo al usuario. . .
si (exceptoHandler! = nulo)
exceptoHandler();
}
}
anulación protegida void OnInit(EventArgs e) {
// Inicializa el registrador. Justo aquí GetType() puede obtener el tipo real de la subclase.
registrador = LogManager.GetLogger(this.GetType());
base.OnInit(e);
}
}
}
Bien, dejemos de escribir aquí. Esta es sólo una simple idea mía. El objetivo es implementar una gestión centralizada de excepciones o registros de forma ligera. Por supuesto, esto es incomparable con el concepto completo de AOP, pero dicho esto, parece que actualmente no existe un marco AOP perfecto en .NET.
http://www.cnblogs.com/RChen/archive/2006/11/16/aspnet_exception_handling.html