Home All Groups Group Topic Archive Search About

How to invoke methods from a SyncProcessMessage?

Author
4 Apr 2006 4:42 PM
MartinParé
Hi,
    I am working on a project and I ran into a little nag! I am writting a
set of custom attributes ,
[PreProcess(Type, aMethod)]
and [PostProcess(Type, aMethod)].
The goal here is to put these attributes on methods so that before the
method is executed the [PreProcess] method is executed and once the method
is
completed the [PostProcess] is executed.

public class JustSomeClass : ContextBoundObject
{
     [PreProcess( typeof(AnotherClass), "PreCondition" )
     [PostProcess( typeof(AnotherClass), "PostCondition" )
     public void SomeMethod()
    {
    }
}

That would turn out that when JustSomeClass.SomeMethod() is called, we would
call AnotherClass.PreCondition and once completed we would call
AnotherClass.PostCondition.

I have managed to get this to work, here is waht my sink looks like:

        public IMessage SyncProcessMessage( IMessage msg )
        {
            IMessage returnMessage = null;

            // Process the Pre-Condition on the method
            PreProcess( msg );

            // Execute the method
            returnMessage = _nextSink.SyncProcessMessage( msg );

            // Process the Post-Condition on the method
            returnMessage = PostProcess( returnMessage );

            return returnMessage;
        }


But I have some nagging little issues to resolve.
#1 - If my Pre-Condition also has [PreProcess()] and [PostProcess()], they
are not called. Seems like my sink is ignored. The same goes for my
PostCondition.
#2 - If my PreCondition sets uses CallContext.SetData() to set store some
data in the logical thread, it gets lost: meaning when I try to retrieve it
I
get a null. This will only happen if the object that I try to set derives
from ILogicalThreadAffinative .


I think that both issues come from the way that I call the PreProcess and
PostProcess. When I need to call PreProcess I create an instance of the
object like so:
Object classObject = Activator.CreateInstance( ClassType );
then I call the method
m_classType.InvokeMember( m_methodName,
                                      BindingFlags.Default |
BindingFlags.InvokeMethod,
                                      null,
                                      classObject,
                                      null );

Since all PreProcess and PostProcess ahve the same signature, this is easy.


Finally my question:
How can I call my PreProcess and PostProcess method in order to get their
own PreProcess and POstProcess attributes evaluated? I see a lot of
documentation about processing messages, but I don't understand how I could
invoke these methods using messages.

Thank you!

--
Lancelot@community.nospam
Martin Paré  :-)

AddThis Social Bookmark Button