Skip to content

stdeepak22/CSharp_Method_Interceptor

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

C# Method Interceptor

This will let you know how we can intercept the method in C# classes.

We're using the approach of Remoting, and IMessageSink.
I've created some file for you to be used readymade.

InterceptSink.cs derived from IMessageSink

InterceptProperty.cs derived from IContextProperty and IContributeObjectSink

and some interface, abstract class and attribute

Log attribute link

public sealed class LogAttribute : OnMethodBoundaryAspect
{
    public override void PreProcess(ref IMethodCallMessage msg)
    {
        Console.WriteLine("PreProcessing:{0}", msg.MethodName);
    }
    public override void PostProcess(IMethodCallMessage callMsg, ref IMethodReturnMessage retMsg)
    {
        Console.WriteLine("Return:{0}", retMsg.ReturnValue);
    }
}

Method Definition link

class MyClassToIntercept : Interceptable
{    
    ..
    ..
    ..
    [Log]
    public override string GetGreetingMsg()
    {
        var result = string.Format("Hi {0}, your age is {1}", Name, Age);
        Console.WriteLine("I'm inside the method.");
        return result;
    }
}

Calling the method as normal link

var obj = new MyClassToIntercept();
obj.GetGreetingMsg();

We will get the result something, Pre processing for the method, then method execution then Post method execution.

PreProcessing:GetGreetingMsg
I'm inside the method.
Return:Hi Deepak, your age is 26

using the 2nd approach We can have PreProcessor and PostProcessor separately

Timer Processor - Pre and Post both link

public class PropWrapper
{
    public string MethodName { get; set; }
    public DateTime StartTime { get; set; }
}
public class TimerProcess : IPreProcessor, IPostProcessor
{

    void IPreProcessor.Process(ref IMethodCallMessage msg)
    {
        var prop = new PropWrapper();
        prop.MethodName = msg.MethodName;
        prop.StartTime = DateTime.Now;

        //to preserver the value from Pre to Post processes, lets add this as property to Msg
        msg.Properties.Add("ExtraProperties", prop);

        Console.WriteLine("Timer started at {0}", DateTime.Now);
    }

    void IPostProcessor.Process(IMethodCallMessage callMsg, ref IMethodReturnMessage retMsg)
    {
        PropWrapper prop = callMsg.Properties["ExtraProperties"] as PropWrapper;
        TimeSpan ts = DateTime.Now.Subtract(prop.StartTime);
        Console.WriteLine("Total time for {0}:{1}ms", prop.MethodName, ts.TotalMilliseconds);
    }

}

Trace - Pre Processor link

public class TracePreProcess : IPreProcessor
{
    public void Process(ref IMethodCallMessage msg)
    {
        Console.WriteLine("PreProcessing:{0}", msg.MethodName);
    }
}

Trcee - Post Processor link

public class TracePostProcess : IPostProcessor
{
    public void Process(IMethodCallMessage callMsg, ref IMethodReturnMessage retMsg)
    {
        Console.WriteLine("Return:{0}", retMsg.ReturnValue);
    }
}

Method Definition link

class MyClassToIntercept : Interceptable
{    
    ..
    ..
    ..
    [PreProcess(typeof(TimerProcess), typeof(TracePreProcess))]        
    [PostProcess(typeof(TimerProcess), typeof(TracePostProcess))] 
    public override string GetGreetingMsg()
    {
        var result = string.Format("Hi {0}, your age is {1}", Name, Age);
        Console.WriteLine("I'm inside the method.");
        return result;
    }
}

Calling the method as normal link

var obj = new MyClassToIntercept();
obj.GetGreetingMsg();

Expected result should be like -

Timer started at 3/16/2017 5:26:25 PM
PreProcessing:GetGreetingMsg
I'm inside the method.
Total time for GetGreetingMsg:12.012ms
Return:Hi Deepak, your age is 26

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages