Пример #1
0
        public Interceptor[] GetPropertyInterceptors(Type interceptorType, PropertyInfo property, out MethodInfo[] methods)
        {
            if (_interceptorResolver == null)
            {
                throw new InvalidOperationException("Weld component manager is not yet deployed");
            }

            var resolvable   = new InterceptorResolvable(interceptorType, property);
            var interceptors = _interceptorResolver.Resolve(resolvable).ToArray();

            if (interceptors.Any())
            {
                methods = new[] { property.SetMethod, property.GetMethod }.Where(x => x != null).ToArray();
                foreach (var method in methods)
                {
                    InterceptionValidator.ValidateInterceptableMethod(method, resolvable);
                }
            }
            else
            {
                methods = new MethodInfo[0];
            }

            return(interceptors);
        }
Пример #2
0
        private static void ThrowNotInterceptableClassException(Type type, InterceptorResolvable resolvable,
                                                                string reason)
        {
            var msg = string.Format("Class [{0}] with interceptor-bindings [{1}] {2}", type,
                                    string.Join(",", resolvable.Bindings.Cast <object>().ToArray()),
                                    reason);

            throw new NotInterceptableException(msg);
        }
Пример #3
0
 public static void ValidateInterceptableMethod(MethodInfo methodInfo, InterceptorResolvable resolvable)
 {
     if (methodInfo.IsStatic)
     {
         ThrowNotInterceptableMethodException(methodInfo, resolvable, "must not be static");
     }
     if (methodInfo.IsPrivate)
     {
         ThrowNotInterceptableMethodException(methodInfo, resolvable, "must not be private");
     }
     if (!TypeUtils.IsOveridable(methodInfo))
     {
         ThrowNotInterceptableMethodException(methodInfo, resolvable, "must be virtual");
     }
 }
Пример #4
0
        public Interceptor[] GetMethodInterceptors(Type interceptorType, MethodInfo methodInfo)
        {
            if (_interceptorResolver == null)
            {
                throw new InvalidOperationException("Weld component manager is not yet deployed");
            }

            var resolvable   = new InterceptorResolvable(interceptorType, methodInfo);
            var interceptors = _interceptorResolver.Resolve(resolvable).ToArray();

            if (interceptors.Any())
            {
                InterceptionValidator.ValidateInterceptableMethod(methodInfo, resolvable);
            }

            return(interceptors);
        }
Пример #5
0
        public Interceptor[] GetClassInterceptors(Type interceptorType, IComponent component, out MethodInfo[] methods)
        {
            if (_interceptorResolver == null)
            {
                throw new InvalidOperationException("Weld component manager is not yet deployed");
            }

            var intercetorResolvable = new InterceptorResolvable(interceptorType, component);
            var interceptors         = _interceptorResolver.Resolve(intercetorResolvable).ToArray();
            var allowPartial         = interceptors.All(x => x.AllowPartialInterception);

            if (interceptors.Any())
            {
                InterceptionValidator.ValidateInterceptableClass(component.Type, intercetorResolvable, allowPartial, out methods);
            }
            else
            {
                methods = new MethodInfo[0];
            }

            return(interceptors);
        }
Пример #6
0
        public static void ValidateInterceptableClass(Type type, InterceptorResolvable resolvable, bool allowPartial, out MethodInfo[] methods)
        {
            var builder = new StringBuilder();

            if (type.IsSealed)
            {
                builder.Append("class is sealed");
            }

            const BindingFlags flagsAll = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

            methods = type.GetMethods(flagsAll)
                      .Union(type.GetProperties(flagsAll)
                             .SelectMany(x => new[] { x.SetMethod, x.GetGetMethod() }.Where(m => m != null)))
                      .Where(x => !x.IsPrivate).ToArray();

            var nonVirtualMethods = methods.Where(x => !TypeUtils.IsOveridable(x) && x.DeclaringType != typeof(object)).ToArray();

            if (nonVirtualMethods.Any())
            {
                if (allowPartial)
                {
                    methods = methods.Except(nonVirtualMethods).ToArray();
                }
                else
                {
                    builder.Append(
                        string.Format("These public members must be virtual: {0}",
                                      string.Join(",/n", nonVirtualMethods.Select(x => x.ToString()))));
                }
            }
            if (builder.Length > 0)
            {
                ThrowNotInterceptableClassException(type, resolvable, builder.ToString());
            }
        }
Пример #7
0
        private static void ThrowNotInterceptableMethodException(MethodInfo methodInfo, InterceptorResolvable resolvable,
                                                                 string reason)
        {
            var msg = string.Format("Method [{0}] with interceptor-bindings [{1}] {2}", methodInfo,
                                    string.Join(",", resolvable.Bindings.Cast <object>().ToArray()),
                                    reason);

            throw new NotInterceptableException(msg);
        }