/// <summary>
        /// 每个被拦截的方法中执行
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        public override async Task Invoke(AspectContext context, AspectDelegate next)
        {
            try
            {
                Console.WriteLine("AddAsync方法开始前");
                await next(context); // 执行被拦截的方法
            }
            catch (Exception)
            {
                Console.WriteLine("AddAsync方法出错");
                //重复调用示例
                ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();
                using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
                {
                    var baseClass = context.Proxy;
                    foreach (var item in baseClass.GetType().GetMethods())
                    {
                        if (item.Name.ToString() == _mess)
                        {
                            MethodInfo methodinfo = baseClass.GetType().GetMethod(_mess);
                            methodinfo.Invoke(baseClass, null);
                        }
                    }
                }

                throw;
            }
            finally
            {
                Console.WriteLine("AddAsync方法结束");
            }
        }
        public DynamicProxyTestBase()
        {
            var builder = new ProxyGeneratorBuilder();

            builder.Configure(Configure);
            ProxyGenerator = builder.Build();
        }
Esempio n. 3
0
        /// <summary>
        /// Creates the rpc proxy.
        /// </summary>
        /// <param name="args">The args.</param>
        /// <returns>A T.</returns>
        public T CreateRpcProxy <T>(params object[] args) where T : class
        {
            var builder = new ProxyGeneratorBuilder();

            builder.Configure(t => t.Interceptors.AddTyped <InnerAssemblyInterceptor>(new object[] { targetObj }));
            var proxyCreate = builder.Build();

            return(proxyCreate.CreateClassProxy <T>(args));
        }
Esempio n. 4
0
        /// <summary>
        /// Creates the rpc proxy.
        /// </summary>
        /// <param name="args">The args.</param>
        /// <returns>A T.</returns>
        public T CreateRpcProxy <T>(params object[] args) where T : class
        {
            //创建代理类
            var builder = new ProxyGeneratorBuilder();

            builder.Configure(t => t.Interceptors.AddTyped <PollyInterceptor>(new object[] { option }));
            var type        = typeof(T);
            var proxyCreate = builder.Build();

            return(proxyCreate.CreateClassProxy <T>(args));
        }
Esempio n. 5
0
        public async Task <IEnumerable <string> > Get()
        {
            ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();

            using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
            {
                Person p = proxyGenerator.CreateClassProxy <Person>();
                Console.WriteLine(await p.HelloAsync("yzk"));
                //Console.WriteLine(p.Add(1, 2));
            }

            return(new string[] { "value1", "value2" });
        }
Esempio n. 6
0
        private static void Main(string[] args)
        {
            ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();

            using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
            {
                Person p = proxyGenerator.CreateClassProxy <Person>();
                //注入
                p.Say("rupeng.com");
                Console.WriteLine(p.GetType());
                Console.WriteLine(p.GetType().BaseType);
            }
            Console.ReadKey();
        }
        /// <summary>
        /// 使用WebApi动态代理客户端
        /// </summary>
        /// <param name="service"></param>
        /// <param name="optionAction"></param>
        public static IServiceCollection AddWebApiProxy(this IServiceCollection service, Action <WebApiProxyOptions> optionAction)
        {
            AppDomain.CurrentDomain.UpdateExcutingAssemblies();

            var option = new WebApiProxyOptions();

            optionAction(option);

            var proxyService = new List <Type>();

            var proxyGeneratorBuilder = new ProxyGeneratorBuilder();

            foreach (var o in option.WebApiProxies)
            {
                var types = o.GetType().Assembly.GetTypes().Where(x =>
                                                                  x.IsInterface && x.GetMethods().SelectMany(m => m.GetCustomAttributes(typeof(ApiActionAttribute), true)).Any());

                proxyGeneratorBuilder.Configure(config =>
                {
                    config.Interceptors.AddTyped(typeof(HttpApiClient), new object[] { o.BaseUrl ?? option.ProxyHost });
                });

                proxyService.AddRange(types);
            }

            foreach (var type in option.RegisteredServices)
            {
                if (type.Value.IsInterface && type.Value.GetMethods()
                    .SelectMany(m => m.GetCustomAttributes(typeof(ApiActionAttribute), true)).Any())
                {
                    proxyGeneratorBuilder.Configure(config =>
                    {
                        config.Interceptors.AddTyped(typeof(HttpApiClient), new object[] { type.Key ?? option.ProxyHost });
                    });

                    proxyService.Add(type.Value);
                }
            }

            var proxyGenerator = proxyGeneratorBuilder.Build();

            foreach (var type in proxyService)
            {
                var proxy = proxyGenerator.CreateInterfaceProxy(type);
                service.AddSingleton(type, x => proxy);
            }

            return(service);
        }
Esempio n. 8
0
        static void Main(string[] args)
        {
            Console.WriteLine("开始程序");
            //User user = new User();
            //user.AddAsync();
            ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();

            using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
            {
                User p = proxyGenerator.CreateClassProxy <User>();
                p.AddAsync();
                //p.Error1();
            }

            Console.ReadLine();
        }
Esempio n. 9
0
        static void Main(string[] args)
        {
            //为了使用熔断降级 ,代码不至于与业务代码在一起 ,使用aop
            //国产Aop  Install-Package AspectCore.Core -Version 0.5.0
            //版本更新比较快,注意使用
            //使用Aop封装降级  见项目 MyHystrix

            //方法调用
            ProxyGeneratorBuilder proxyGeneratorBuilder = new ProxyGeneratorBuilder();

            using (IProxyGenerator proxyGenerator = proxyGeneratorBuilder.Build())
            {
                Person p = proxyGenerator.CreateClassProxy <Person>();
                p.Say("大海");
            }

            Console.ReadKey();
        }