Exemple #1
0
        /// <summary>
        /// Create the interceptable proxy based on specified type, target and method specific interceptors.
        /// </summary>
        /// <param name="typeToProxy">The type of interceptable proxy.</param>
        /// <param name="target">The target object wrapped by proxy.</param>
        /// <returns>The created interceptable proxy.</returns>
        /// <exception cref="ArgumentNullException">The specified <paramref name="typeToProxy"/> is null.</exception>
        public virtual object CreateProxy(Type typeToProxy, object target)
        {
            Guard.ArgumentNotNull(typeToProxy, "typeToProxy");
            if (!this.WillWrapTarget(target))
            {
                return(target);
            }

            Dictionary <MethodInfo, InterceptorDelegate> interceptors = new Dictionary <MethodInfo, InterceptorDelegate>();
            TypeInfo targetType        = target.GetType().GetTypeInfo();
            var      providersForClass = GetProvidersForClass(target);

            foreach (var methodOfProxy in typeToProxy.GetTypeInfo().GetMethods().Where(it => it.DeclaringType == typeToProxy))
            {
                var providers = this.GetProvidersForMethod(methodOfProxy, target.GetType(), providersForClass);
                if (providers.Any())
                {
                    IInterceptorBuilder newBuilder = this.InterceptorBuilder.New();
                    providers.ForEach(it => it.Use(newBuilder));
                    interceptors[methodOfProxy] = newBuilder.Build();
                }
            }

            return(this.Wrap(typeToProxy, target, interceptors));
        }
Exemple #2
0
        /// <summary>
        /// Create a new <see cref="ProxyFactory"/>.
        /// </summary>
        /// <param name="serviceProvider">The service provider to provide neccessary services.</param>
        /// <param name="interceptorBuilder"></param>
        /// <exception cref="ArgumentNullException">The specified <paramref name="serviceProvider"/> is null.</exception>
        /// <exception cref="ArgumentNullException">The specified <paramref name="interceptorBuilder"/> is null.</exception>
        public ProxyFactory(IServiceProvider serviceProvider, IInterceptorBuilder interceptorBuilder)
        {
            Guard.ArgumentNotNull(serviceProvider, "serviceProvider");
            Guard.ArgumentNotNull(interceptorBuilder, "interceptorBuilder");

            this.ServiceProvider    = serviceProvider;
            this.InterceptorBuilder = interceptorBuilder;
        }
Exemple #3
0
        /// <summary>
        /// Add a new interceptor to interceptor chain.
        /// </summary>
        /// <param name="builder">The interceptor builder.</param>
        /// <param name="interceptorType">The type of interceptor.</param>
        /// <param name="order">The order to determine the position in the interceptor chain.</param>
        /// <param name="arguments">The arguments passed to constructor.</param>
        /// <returns>The current interceptor builder.</returns>
        /// <exception cref="ArgumentNullException">The specified <paramref name="builder"/> is null.</exception>
        /// <exception cref="ArgumentNullException">The specified <paramref name="interceptorType"/> is null.</exception>
        /// <exception cref="ArgumentException">The specified <paramref name="interceptorType"/> is not a valid interceptor.
        /// <para>The valid interceptor class should be defined as below.</para>
        /// <code>
        /// public class FoobarInterceptor
        /// {
        ///     private InterceptDelegate _next;
        ///     private IFoo              _foo;
        ///
        ///     public FoobarInterceptor(InterceptDelegate next, IFoo foo)
        ///     {
        ///         _next = next;
        ///         _foo = foo;
        ///     }
        ///
        ///     public Task InvokeAsync(InvocationContext context, IBar bar)
        ///     {
        ///         ...
        ///         await _next(context);
        ///     }
        /// }
        /// </code>
        /// </exception>
        public static IInterceptorBuilder Use(this IInterceptorBuilder builder, Type interceptorType, int order, params object[] arguments)
        {
            Guard.ArgumentNotNull(builder, "builder");
            Guard.ArgumentNotNull(interceptorType, "interceptorType");
            InterceptorDelegate interceptor = next => (async context =>
            {
                object[] newArguments = new object[arguments.Length + 1];
                newArguments[0] = next;
                arguments.CopyTo(newArguments, 1);
                object instance = ActivatorUtilities.CreateInstance(builder.ServiceProvider, interceptorType, newArguments);
                InvokeDelegate factory = GetFactory(interceptorType);
                await factory(instance, context, builder.ServiceProvider);
            });

            return(builder.Use(interceptor, order));
        }
Exemple #4
0
 /// <summary>
 /// Add a new interceptor to interceptor chain.
 /// </summary>
 /// <typeparam name="TInterceptor">The type of interceptor.</typeparam>
 /// <param name="builder">The interceptor builder.</param>
 /// <param name="order">The order to determine the position in the interceptor chain.</param>
 /// <param name="arguments">The arguments passed to constructor.</param>
 /// <returns>The current interceptor builder.</returns>
 /// <exception cref="ArgumentNullException">The specified <paramref name="builder"/> is null.</exception>
 /// <exception cref="ArgumentException">The specified <typeparamref name="TInterceptor"/> is not a valid interceptor.
 /// <para>The valid interceptor class should be defined as below.</para>
 /// <code>
 /// public class FoobarInterceptor
 /// {
 ///     private InterceptDelegate _next;
 ///     private IFoo              _foo;
 ///
 ///     public FoobarInterceptor(InterceptDelegate next, IFoo foo)
 ///     {
 ///         _next = next;
 ///         _foo = foo;
 ///     }
 ///
 ///     public Task InvokeAsync(InvocationContext context, IBar bar)
 ///     {
 ///         ...
 ///         await _next(context);
 ///     }
 /// }
 /// </code>
 /// </exception>
 public static IInterceptorBuilder Use <TInterceptor>(this IInterceptorBuilder builder, int order, params object[] arguments)
 {
     return(builder.Use(typeof(TInterceptor), order, arguments));
 }
 public override void Use(IInterceptorBuilder interceptorBuilder)
 {
     Guard.ArgumentNotNull(interceptorBuilder, nameof(interceptorBuilder));
     interceptorBuilder.Use <ExceptionInterceptor>(this.Order, ExceptionName, RetrieTimes);
 }
 /// <summary>
 /// Create a new <see cref="DynamicProxyFactory"/>.
 /// </summary>
 /// <param name="serviceProvider">The service provider to provide neccessary services.</param>
 /// <param name="interceptorBuilder"></param>
 public DynamicProxyFactory(IServiceProvider serviceProvider, IInterceptorBuilder interceptorBuilder) : base(serviceProvider, interceptorBuilder)
 {
     _proxyGenerator = new ProxyGenerator();
 }
Exemple #7
0
 /// <summary>
 /// Collect the interceptor using specified inteceptor builder.
 /// </summary>
 /// <param name="interceptorBuilder">The inteceptor builder to collect interceptor.</param>
 /// <exception cref="ArgumentNullException">The specified <paramref name="interceptorBuilder"/> is null.</exception>
 public abstract void Use(IInterceptorBuilder interceptorBuilder);