public void Wrap() { var fooMethod = typeof(IFoobar).GetMethod("Foo"); var barProperty = typeof(IFoobar).GetProperty("Bar"); InterceptorDelegate interceptor = next => (context => Task.Run(() => _flag++)); var interceptors = new Dictionary <MethodInfo, InterceptorDelegate> { [fooMethod] = interceptor, [barProperty.GetMethod] = interceptor }; var interception = new InterceptorDecoration(interceptors, typeof(Foobar).GetInterfaceMap(typeof(IFoobar))); var proxy = new InterfaceDynamicProxyGenerator(new DynamicProxyFactoryCache()) .Wrap(typeof(IFoobar), new Foobar(), interception) as IFoobar; _flag = 0; proxy.Foo(); Assert.Equal(1, _flag); var bar = proxy.Bar; Assert.Equal(2, _flag); proxy.Bar = "111"; Assert.Equal(2, _flag); }
public void GetInterceptors() { var invokeMethod = typeof(Foobar).GetMethod("Invoke"); var fooProperty = typeof(Foobar).GetProperty("Foo"); InterceptorDelegate interceptor = next => null; var interceptors = new Dictionary <MethodInfo, InterceptorDelegate> { [invokeMethod] = interceptor, [fooProperty.GetMethod] = interceptor }; var interception = new InterceptorDecoration(interceptors, typeof(Foobar).GetInterfaceMap(typeof(IFoobar))); Assert.False(interception.IsEmpty); Assert.True(interception.Contains(invokeMethod)); Assert.True(interception.Contains(fooProperty.GetMethod)); Assert.False(interception.Contains(fooProperty.SetMethod)); Assert.True(interception.IsInterceptable(invokeMethod)); Assert.True(interception.IsInterceptable(fooProperty.GetMethod)); Assert.False(interception.IsInterceptable(fooProperty.SetMethod)); Assert.Same(interceptor, interception.GetInterceptor(invokeMethod)); Assert.Same(interceptor, interception.GetInterceptor(fooProperty.GetMethod)); Assert.Same(typeof(Foobar).GetMethod("Invoke"), interception.GetTargetMethod(typeof(IFoobar).GetMethod("Invoke"))); }
private T CreateProxy <T>(T target, InterceptorDelegate interceptor, MethodInfo method) { var methodBasedInterceptor = new MethodBasedInterceptorDecoration(method, interceptor); var decoration = new InterceptorDecoration(new MethodBasedInterceptorDecoration[] { methodBasedInterceptor }, null); var generator = DynamicProxyClassGenerator.CreateInterfaceGenerator(typeof(T), decoration); var proxyType = generator.GenerateProxyType(); return((T)Activator.CreateInstance(proxyType, target, decoration)); }
private T1 CreateProxy <T1, T2>(T1 target, InterceptorDelegate interceptor, Expression <Func <T1, T2> > propertyAccessor) { var property = (PropertyInfo)((MemberExpression)propertyAccessor.Body).Member; var propertyBasedInterceptor = new PropertyBasedInterceptorDecoration(property, interceptor, interceptor); var decoration = new InterceptorDecoration(null, new PropertyBasedInterceptorDecoration[] { propertyBasedInterceptor }); var generator = DynamicProxyClassGenerator.CreateInterfaceGenerator(typeof(T1), decoration); var proxyType = generator.GenerateProxyType(); return((T1)Activator.CreateInstance(proxyType, target, decoration)); }
/// <summary> /// Create a proxy wrapping specified target instance. /// </summary> /// <param name="typeToIntercept">The type to intercept.</param> /// <param name="target">The target.</param> /// <param name="interceptors">The interceptors.</param> /// <returns></returns> protected override object Wrap(Type typeToIntercept, object target, InterceptorDecoration interceptors) { var dictionary = interceptors.Interceptors .ToDictionary(it => it.Key, it => new DynamicProxyInterceptor(it.Value).ToInterceptor()); var selector = new DynamicProxyInterceptorSelector(dictionary.ToDictionary(it => it.Key, it => it.Value)); var options = new ProxyGenerationOptions { Selector = selector }; return(_proxyGenerator.CreateInterfaceProxyWithTarget(typeToIntercept, target, dictionary.Values.ToArray())); }
private T CreateProxy <T>(InterceptorDelegate interceptor, MethodInfo method) { var methodBasedInterceptor = new MethodBasedInterceptorDecoration(method, interceptor); var decoration = new InterceptorDecoration(new MethodBasedInterceptorDecoration[] { methodBasedInterceptor }, null); var generator = DynamicProxyClassGenerator.CreateVirtualMethodGenerator(typeof(T), decoration); var proxyType = generator.GenerateProxyType(); var proxy = (T)Activator.CreateInstance(proxyType); ((IInterceptorsInitializer)proxy).SetInterceptors(decoration); return(proxy); }
public void TestGenericMethod() { var method = typeof(Calculator).GetMethod("Multiply"); string flag = ""; InterceptorDelegate interceptor = next => (context => { flag = "Foobar"; return(next(context)); }); var decoration = new InterceptorDecoration(new MethodBasedInterceptorDecoration[] { new MethodBasedInterceptorDecoration(method, interceptor) }, null); var proxy = this.CreateProxy <Calculator>(interceptor, typeof(Calculator).GetMethod("Multiply")); Assert.Equal(2, proxy.Multiply(1, 2)); Assert.Equal("Foobar", flag); }
private T1 CreateProxy <T1, T2>(InterceptorDelegate interceptor, Expression <Func <T1, T2> > propertyAccessor) { var property = (PropertyInfo)((MemberExpression)propertyAccessor.Body).Member; var propertyBasedInterceptor = new PropertyBasedInterceptorDecoration(property, interceptor, interceptor); var decoration = new InterceptorDecoration(null, new PropertyBasedInterceptorDecoration[] { propertyBasedInterceptor }); var generator = DynamicProxyClassGenerator.CreateVirtualMethodGenerator(typeof(T1), decoration); var proxyType = generator.GenerateProxyType(); var proxy = (T1)Activator.CreateInstance(proxyType); ((IInterceptorsInitializer)proxy).SetInterceptors(decoration); return(proxy); }
public void Create() { var foo1Method = typeof(Foobar).GetMethod("Foo1"); var foo2Method = typeof(Foobar).GetMethod("Foo2"); var bar1Property = typeof(Foobar).GetProperty("Bar1"); var bar2Property = typeof(Foobar).GetProperty("Bar2"); InterceptorDelegate interceptor = next => (context => Task.Run(() => _flag++)); var interceptors = new Dictionary <MethodInfo, InterceptorDelegate> { [foo1Method] = interceptor, [foo2Method] = interceptor, [bar1Property.GetMethod] = interceptor, [bar2Property.GetMethod] = interceptor, }; var interception = new InterceptorDecoration(interceptors); var proxy = new VirtualMethodDynamicProxyGenerator(new DynamicProxyFactoryCache()) .Create(typeof(Foobar), interception, new ServiceCollection().BuildServiceProvider()) as Foobar; _flag = 0; proxy.Foo1(); Assert.Equal(1, _flag); proxy.Foo2(); Assert.Equal(1, _flag); var bar = proxy.Bar1; Assert.Equal(2, _flag); bar = proxy.Bar2; Assert.Equal(2, _flag); proxy.Bar1 = "123"; Assert.Equal(2, _flag); proxy.Bar2 = "123"; Assert.Equal(2, _flag); }
/// <summary> /// Create an interceptable proxy instance. /// </summary> /// <param name="typeToIntercept">The type to intercept.</param> /// <param name="serviceProvider">The <see cref="T:System.IServiceProvider" /> used to provide dependent service instances.</param> /// <param name="interceptors">The <see cref="T:Dora.DynamicProxy.InterceptorDecoration" /> representing which interceptors are applied to which members of a type to intercept.</param> /// <returns> /// The interceptable proxy instance. /// </returns> protected override object Create(Type typeToIntercept, IServiceProvider serviceProvider, InterceptorDecoration interceptors) { var dictionary = interceptors.Interceptors .ToDictionary(it => it.Key, it => new DynamicProxyInterceptor(it.Value).ToInterceptor()); var selector = new DynamicProxyInterceptorSelector(dictionary.ToDictionary(it => it.Key, it => it.Value)); var options = new ProxyGenerationOptions { Selector = selector }; return(_proxyGenerator.CreateClassProxy(typeToIntercept, options, dictionary.Values.ToArray())); }
/// <summary> /// Create a proxy wrapping specified target instance. /// </summary> /// <param name="typeToIntercept">The type to intercept.</param> /// <param name="target">The target.</param> /// <param name="interceptors">The interceptors.</param> protected abstract object Wrap(Type typeToIntercept, object target, InterceptorDecoration interceptors);
/// <summary> /// Create an interceptable proxy instance. /// </summary> /// <param name="typeToIntercept">The type to intercept.</param> /// <param name="serviceProvider">The <see cref="IServiceProvider"/> used to provide dependent service instances.</param> /// <param name="interceptors">The <see cref="InterceptorDecoration"/> representing which interceptors are applied to which members of a type to intercept.</param> /// <returns>The interceptable proxy instance.</returns> protected abstract object Create(Type typeToIntercept, IServiceProvider serviceProvider, InterceptorDecoration interceptors);
public CalcultorProxy(ICalculator target, InterceptorDecoration interceptors) { _target = target; _interceptors = interceptors; }
/// <summary> /// Create an interceptable proxy instance. /// </summary> /// <param name="typeToIntercept">The type to intercept.</param> /// <param name="serviceProvider">The <see cref="IServiceProvider" /> used to provide dependent service instances.</param> /// <param name="interceptors">The <see cref="InterceptorDecoration" /> representing which interceptors are applied to which members of a type to intercept.</param> /// <returns> /// The interceptable proxy instance. /// </returns> protected override object Create(Type typeToIntercept, IServiceProvider serviceProvider, InterceptorDecoration interceptors) { return(TypeDynamicProxyGenerator.Create(typeToIntercept, interceptors, serviceProvider)); }
/// <summary> /// Create a proxy wrapping specified target instance. /// </summary> /// <param name="typeToIntercept">The type to intercept.</param> /// <param name="target">The target.</param> /// <param name="interceptors">The interceptors.</param> /// <returns></returns> protected override object Wrap(Type typeToIntercept, object target, InterceptorDecoration interceptors) { return(InstanceDynamicProxyGenerator.Wrap(typeToIntercept, target, interceptors)); }