No, está bien como está. El código es bastante lioso, pero hay que tener en cuenta que es un "truco" para soportar AOP en un entorno que no está pensado para ello. Más o menos hace lo siguiente:
La clase "McPolu" hereda de ContextBound, lo que le indica a la CLR que los objetos de esa clase necesitan un contexto (recordemos que en .NET hay dos tipos de objetos, los 'ContextBound' y los 'agile').
La clase "McPolu" está decorada con el atributo "AtributoMcPolu" que implementa IContextAttribute. Por lo tanto, la CLR le preguntara a "AtributoMcPolu" si el contexto actual es correcto o no. Como IsContextOK devuelve false, la CLR crea un nuevo contexto y llama a GetPropertiesForNewContext, donde colocamos la "PropiedadMcPolu" en el nuevo contexto.
Como la "PropiedadMcPolu" implementa IContributeServerContextSink, durante la creación del nuevo contexto se va a invocar a GetServerContextSink que devuelve el "SumideroMcPolu".
Ahora que ya esta todo montado, cada vez que el thread principal salga del contexto original para entrar en el contexto nuevo (esto es, cada vez que se acceda al objeto "McPolu" desde fuera) se va a invocar al SumideroMcPolu en medio. La cosa queda:
El cliente invoca al servidor: mcp.Saluda();
La CLR se da cuenta de que el thread esta cambiando de un contexto a otro e invoca al Sumidero de forma transparente.
El sumidero hace algo antes: WriteLine(...)
Se invoca al siguiente sumidero en la pila de sumideros:
En este caso, como solo hemos puesto uno, el siguiente sumidero es la autentica funcion McPolu.Saluda()
El flujo retorna al sumidero, que hace algo despues; WriteLine(...)
Los if(msg.Properties["__MethodName"].Equals("Saluda") ) están ahí para no hacer nada cuando se llame a otro método de la clase. En este mismo ejemplo, si quitas esos if's verás que la salida del programa es:
En el sumidero: antes
En el sumidero: después
En el sumidero: antes
Hola, mundo
En el sumidero: después
El primer par de 'antes' y 'despues' correspondería a la llamada al constructor.
Un follón, vaya.
--
En España la mejor manera de guardar un secreto es escribir un libro.
No entiendo una cosa
(Puntos:2)( http://geeks.ms/blogs/cpsaez/ | Última bitácora: Miércoles, 12 Octubre de 2016, 21:19h )
En los if que viene debajo, son iguales, ¿No deberian ser distintos?
Under a sea of dust lies a vast wealth of wisdom
Re:No entiendo una cosa
(Puntos:2)( http://mcpolu.blogspot.com/ | Última bitácora: Miércoles, 05 Marzo de 2014, 00:04h )
La clase "McPolu" hereda de ContextBound, lo que le indica a la CLR que los objetos de esa clase necesitan un contexto (recordemos que en .NET hay dos tipos de objetos, los 'ContextBound' y los 'agile').
La clase "McPolu" está decorada con el atributo "AtributoMcPolu" que implementa IContextAttribute. Por lo tanto, la CLR le preguntara a "AtributoMcPolu" si el contexto actual es correcto o no. Como IsContextOK devuelve false, la CLR crea un nuevo contexto y llama a GetPropertiesForNewContext, donde colocamos la "PropiedadMcPolu" en el nuevo contexto.
Como la "PropiedadMcPolu" implementa IContributeServerContextSink, durante la creación del nuevo contexto se va a invocar a GetServerContextSink que devuelve el "SumideroMcPolu".
Ahora que ya esta todo montado, cada vez que el thread principal salga del contexto original para entrar en el contexto nuevo (esto es, cada vez que se acceda al objeto "McPolu" desde fuera) se va a invocar al SumideroMcPolu en medio. La cosa queda:
El cliente invoca al servidor: mcp.Saluda();
La CLR se da cuenta de que el thread esta cambiando de un contexto a otro e invoca al Sumidero de forma transparente.
El sumidero hace algo antes: WriteLine(...)
Se invoca al siguiente sumidero en la pila de sumideros:
IMessage returnedMessage = this.next.SyncProcessMessage(msg);
En este caso, como solo hemos puesto uno, el siguiente sumidero es la autentica funcion McPolu.Saluda()
El flujo retorna al sumidero, que hace algo despues; WriteLine(...)
Los if(msg.Properties["__MethodName"].Equals("Saluda") ) están ahí para no hacer nada cuando se llame a otro método de la clase. En este mismo ejemplo, si quitas esos if's verás que la salida del programa es:
En el sumidero: antes
En el sumidero: después
En el sumidero: antes
Hola, mundo
En el sumidero: después
El primer par de 'antes' y 'despues' correspondería a la llamada al constructor.
Un follón, vaya.
En España la mejor manera de guardar un secreto es escribir un libro.