/// <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)); }
/// <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; }
/// <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)); }
/// <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(); }
/// <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);