Dynamic Proxy 2: Mixins
I needed a rest from dealing with SSIS and data migrations issues, so I decided to put some time in real code. I just finished adding support for Mixins to Dynamic Proxy 2. Here is the first test that passed, the name should tell you quite a bit about what is required to make it work.
[Test]
public void CanCreateSimpleMixinWithoutGettingExecutionEngineExceptionsOrBadImageExceptions()
{
ProxyGenerationOptions proxyGenerationOptions = new ProxyGenerationOptions();
proxyGenerationOptions.AddMixinInstance(new SimpleMixin());
object proxy = generator.CreateClassProxy(
typeof(object), proxyGenerationOptions, new AssertInvocationInterceptor());
Assert.IsTrue(proxy is ISimpleMixin);
((ISimpleMixin)proxy).DoSomething();
}
The generated proxy looks something like this one:
public class ObjectProxyefb7dccd21fe43b5b2d13c788dce3bdb : ISimpleMixin
{
public IInterceptor[] __interceptors;
public ISimpleMixin __mixin_Castle_DynamicProxy_Test_Mixins_ISimpleMixin;
public static MethodInfo tokenCache1 = ((MethodInfo) methodof(ISimpleMixin.DoSomething, ISimpleMixin));
public static Type typeTokenCache = typeof(object);
public ObjectProxyefb7dccd21fe43b5b2d13c788dce3bdb(ISimpleMixin mixin1, IInterceptor[] interceptorArray1)
{
this.__mixin_Castle_DynamicProxy_Test_Mixins_ISimpleMixin = mixin1;
this.__interceptors = interceptorArray1;
}
public override int DoSomething()
{
object[] objArray = new object[0];
InvocationDoSomething_1 g_ = new InvocationDoSomething_1(
this.__mixin_Castle_DynamicProxy_Test_Mixins_ISimpleMixin,
this.__interceptors, typeTokenCache, tokenCache1, objArray, this);
g_.Proceed();
return (int) g_.ReturnValue;
}
[Serializable]
public sealed class InvocationDoSomething_1 : AbstractInvocation
{
public ISimpleMixin target;
public InvocationDoSomething_1(ISimpleMixin mixin1, IInterceptor[] interceptorArray1, Type type1, MethodInfo info1,
object[] objArray1, object obj1) : base(mixin1, obj1, interceptorArray1, type1, info1, objArray1)
{
this.target = mixin1;
}
public sealed override void InvokeMethodOnTarget()
{
int num = this.target.DoSomething();
base.ReturnValue = num;
}
}
}
The code is in the repository, if you feel like taking it out for a spin.
Comments
Comment preview