Beispiel #1
0
        /// <summary>
        /// 注册为代理服务
        /// </summary>
        /// <param name="setting">配置</param>
        /// <returns></returns>
        public IProxyRegisterRule AsProxy(InterceptCompileSetting setting)
        {
            var rule = this.AsProxy();

            this.setting = setting;
            return(rule);
        }
        /// <summary>
        /// 进行构建
        /// </summary>
        /// <param name="target">目标对象</param>
        /// <param name="setting">配置</param>
        /// <param name="interceptors">所实现的拦截器接口</param>
        /// <returns></returns>
        public Func <Target, IInterceptor[], Target> Build(Target target, InterceptCompileSetting setting, Type[] interceptors)
        {
            var build = this.BuildNotCepaType(target);

            if (build != null)
            {
                return(build);
            }

            var newType = default(Type);

            /*构建接口,较为容易*/
            if (this.TargetType.IsInterface)
            {
                newType = BuildInterface(this.TargetType, typeof(Target), interceptors, setting);
                var interfaceEmit = EasyEmitBuilder <Func <Target, IInterceptor[], Target> > .NewDynamicMethod();

                interfaceEmit.LoadArgument(0);
                interfaceEmit.LoadArgument(1);
                interfaceEmit.NewObject(newType.GetConstructor(new[] { typeof(Target), typeof(IInterceptor[]) }));
                interfaceEmit.Return();
                return(interfaceEmit.CreateDelegate());
            }

            newType = BuildClass(target.GetType(), interceptors, setting);
            var classEmit = EasyEmitBuilder <Func <Target, IInterceptor[], Target> > .NewDynamicMethod();

            //classEmit.LoadArgument(0);
            classEmit.LoadArgument(1);
            classEmit.NewObject(newType.GetConstructor(new[] { typeof(IInterceptor[]) }));
            classEmit.Return();

            return(classEmit.CreateDelegate());
        }
        /// <summary>
        /// 注册构建行为
        /// </summary>
        /// <param name="target">目标对象</param>
        /// <param name="setting">配置</param>
        /// <param name="interceptors">所实现的拦截器接口</param>
        /// <returns></returns>
        public static Func <Target, IInterceptor[], Target> Register(Target target, InterceptCompileSetting setting, Type[] interceptors)
        {
            if (func != null)
            {
                return(func);
            }

            return(func = new ProxyMockBuilder <Target>().Build(target, setting, interceptors));
        }
Beispiel #4
0
        /// <summary>
        /// 创建代理对象,T为接口是最佳条件,T若为class,只能重写virtual方法
        /// </summary>
        /// <param name="source">代理对象</param>
        /// <param name="setting">配置</param>
        /// <param name="interceptors">所实现的拦截器接口</param>
        /// <returns></returns>
        public virtual T CreateProxy(T source, InterceptCompileSetting setting, IInterceptor[] interceptors)
        {
            if (interceptors == null)
            {
                interceptors = new IInterceptor[0];
            }

            var types = new Type[interceptors.Length];

            for (var i = 0; i < interceptors.Length; i++)
            {
                types[i] = interceptors[i].GetType();
            }

            return(ProxyMockBuilder <T> .Register(source, setting, types).Invoke(source, interceptors));
        }
            public Type Build(Type implementationType, Type baseType, Type[] interceptors, InterceptCompileSetting setting)
            {
                if (interceptors != null && interceptors.Length > 0)
                {
                    foreach (var i in interceptors)
                    {
                        if (!typeof(IInterceptor).IsAssignableFrom(i))
                        {
                            throw new ArgumentException(string.Format("类型{0}只能从拦截器{1}中派生", i.FullName, typeof(IInterceptor).FullName));
                        }
                    }
                }

                var type = default(Type);

                /*构建接口,较为容易*/
                if (baseType.IsVisible && baseType.IsInterface)
                {
                    type = this.BuildInterface(baseType, implementationType, interceptors, setting);
                    return(type);
                }

                /*构建类*/
                type = this.BuildClass(baseType, interceptors, setting);
                return(type);
            }
Beispiel #6
0
 /// <summary>
 /// 创建代理对象,T为接口是最佳条件,T若为class,只能重写virtual方法
 /// </summary>
 /// <param name="setting">配置</param>
 /// <param name="source">代理对象</param>
 /// <returns></returns>
 public virtual T CreateProxy(T source, InterceptCompileSetting setting)
 {
     return(this.CreateProxy(source, setting, new IInterceptor[0]));
 }