Пример #1
0
        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);
        }
Пример #2
0
        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")));
        }
Пример #3
0
        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));
        }
Пример #4
0
        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));
        }
Пример #5
0
        /// <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()));
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
0
        /// <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);
Пример #13
0
 public CalcultorProxy(ICalculator target, InterceptorDecoration interceptors)
 {
     _target       = target;
     _interceptors = interceptors;
 }
Пример #14
0
 /// <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));
 }
Пример #15
0
 /// <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));
 }