Voy a salir en una extremidad aquí y supongo que está buscando técnicas orientadas a objetos para implementar la instrumentación.
Hay dos formas inmediatas que me vienen a la mente, la más utilizada sería la primera, supongo:
-
Tenga una pila global (singleton o lo que sea) en algún lugar con la que cada método que se ejecute se agregue inmediatamente a sí mismo. manteniendo efectivamente una cadena de llamadas global. No puede, pero no tiene que aparecer en el Al final de cada método que está intentando instrumentar, otras prácticas comunes de instrumentación son iniciar un cronómetro al comienzo de su método y detenerse al final para registrar la duración, etc.
-
Tener un marco de tipo DI que sea un enrutador para todas las llamadas a métodos, lo que podría comportar Es más parecido al paso de mensajes, y dentro de este marco, anotaría en una pila cada llamada de método que ocurra de manera similar a la anterior, excepto que estaría centralizada en este lugar.
No puedo decir que sugiera el n. ° 2 sin tal vez usar algún marco AOP o algo, pero en general, mantener su propio seguimiento de pila en el 100% de las llamadas a métodos es una instrumentación un poco extrema en mi opinión. Genial para depurar cosas tipográficas y tal vez necesario si no estás trabajando en un lenguaje reflexivo, pero estoy seguro de que podría desactivar algo así fácilmente para la producción y hacer todo lo posible para mantenerlo fuera del camino, por lo que no me gusta mucho el # 2 anterior.
Ninguno de estos es necesario dentro de un lenguaje reflexivo y, por lo tanto, no debe implementarse en C # excepto para ilustrar el proceso de cruce límites. (advertencia: podrían ser más rápidos que la reflexión si se hacen correctamente, pero el costo de mantenimiento aún hace que no valgan la pena)
Comentarios
En mi humilde opinión, debería preguntarse seriamente por qué cree que necesita esto.
Si MethodFoo()
se comporta de manera diferente si se llama desde el ensamblado A o B, entonces el ensamblado que llama es algo así como un parámetro de entrada oculto para MethodFoo()
y probablemente se convierta en la causa de un comportamiento inesperado o erróneo.Entonces, como alternativa, haga explícito ese parámetro de entrada: agregue un parámetro adicional a MethodFoo()
que indica el contexto o la persona que llama. Esto podría ser un enum
, un parámetro string
o una referencia al ensamblado de llamada en sí, según el cambio de comportamiento previsto de MethodFoo()
.
Comentarios