/// <summary> /// Creates the specified type to proxy. /// </summary> /// <param name="typeToIntercept">The type to proxy.</param> /// <param name="serviceProvider">The service provider.</param> /// <param name="targetAccessor">The target instance accessor.</param> /// <returns> /// The proxy wrapping the specified target instance. /// </returns> public object Create(Type typeToIntercept, IServiceProvider serviceProvider, Func<object> targetAccessor = null) { Guard.ArgumentNotNull(typeToIntercept, nameof(typeToIntercept)); Guard.ArgumentNotNull(serviceProvider, nameof(serviceProvider)); if (!CanIntercept(typeToIntercept)) { return targetAccessor?.Invoke() ?? serviceProvider.GetService(typeToIntercept); } var interceptors = InterceptorResolver.GetInterceptors(typeToIntercept); if (interceptors.IsEmpty) { return targetAccessor?.Invoke() ?? serviceProvider.GetService(typeToIntercept); } return Create(typeToIntercept, serviceProvider, interceptors); }
/// <summary> /// Create a proxy wrapping specified target instance to wrap the specified target instance. /// </summary> /// <param name="typeToIntercept">The type to intercept.</param> /// <param name="target">The target instance wrapped by the created proxy.</param> /// <returns>The proxy wrapping the specified target instance.</returns> public object Wrap(Type typeToIntercept, object target) { Guard.ArgumentNotNull(typeToIntercept, nameof(typeToIntercept)); Guard.ArgumentNotNull(target, nameof(target)); Guard.ArgumentAssignableTo(typeToIntercept, target.GetType(), nameof(target)); if (!CanIntercept(typeToIntercept)) { return target; } var interceptors = InterceptorResolver.GetInterceptors(typeToIntercept, target.GetType()); if (interceptors.IsEmpty) { return target; } return Wrap(typeToIntercept, target, interceptors); }