Skip to content
Diego Teixeira edited this page Sep 28, 2018 · 2 revisions

Welcome to the proxy-profiler wiki!


ProxyProfiler is a personal project that I started to study AOP. Developing the code, I decided to include Expression Trees for the purpose of study too. This quickly became a reasonable tool and I decided to make it a GitHub project.


This page explains how to use ProxyProfiler.

ProxyProfiler is a generic class that expects an interface as the generic type, because RealProxy can work with MarshalByRefObject. It is composed of two public static methods, Create and GetHistory.

To use ProxyProfiler is simple:

Start calling the Create method and you can get an instance of the same class used as argument, that implements the interface provided as generic parameter, but with ProxyProfiler wrapping it.

Console.Interfaces.ITest testProfiler = ProxyProfiler.ProxyProfiler<Console.Interfaces.ITest>.Create(new Console.Classes.Test());

After that, just start calling your interface methods.

testProfiler.TestNoParams();


Attributes

To start creating your custom profiler attributes, create a class that extends the base Console.Attributes.ProfilerAttribute.

public class LogAttribute : ProxyProfiler.Attribute.ProfilerAttribute { }

ProfilerAttribute expects the type of the object that will handle each event. This type must be the type of a class with an empty public constructor because it will inject an instance of that object on each event.

public LogAttribute(Type type) : base(type) { }

You can override three methods from ProfilerAttribute.

public override void OnBeforeInvoke<T>(T profiler, MethodInfo methodToInvoke, object[] beforeInvokeArgs) { }

public override void OnAfterInvoke<T>(T profiler, MethodInfo invokedMethod, object[] beforeInvokeArgs, object[] afterInvokeArgs, object invokeResult) { }

public override void OnInvokeException<T>(T profiler, MethodInfo invokedMethod, Exception exception) { }

The type of T will be the type supplied to ProfilerAttribute constructor.


Creating the profiler

Create your class that will be injected in your attibute as you like. Just remind of the empty constructor.

public class Log : Console.Interfaces.ILog
{
     public void Debug(string message) { }

     public void Debug(string message, Exception ex) { }
}

Using the attribute

After all that, go to your interface of your class that will be profiled and decorate the methods with the attribute.

public interface ITest
{
        [Console.Attributes.Log(typeof(Console.Classes.Log))]
        void TestNoParams();
}

You can use as many as attributes as you create on each method.