Browse Source

Introducing DynamicProxyIgnoreTypes.

Resolve #3180
pull/3348/head
maliming 7 years ago
parent
commit
f2d3b71224
  1. 6
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
  2. 3
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptorRegistrar.cs
  3. 3
      framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AuthorizationInterceptorRegistrar.cs
  4. 24
      framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/DynamicProxyIgnoreTypes.cs
  5. 3
      framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptorRegistrar.cs
  6. 3
      framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkInterceptorRegistrar.cs
  7. 3
      framework/src/Volo.Abp.Validation/Volo/Abp/Validation/ValidationInterceptorRegistrar.cs
  8. 4
      framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs
  9. 4
      framework/test/Volo.Abp.FluentValidation.Tests/Volo/Abp/FluentValidation/ApplicationService_FluentValidation_Tests.cs
  10. 4
      framework/test/Volo.Abp.Validation.Tests/Volo/Abp/Validation/ApplicationService_Validation_Tests.cs

6
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs

@ -12,6 +12,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Volo.Abp.ApiVersioning; using Volo.Abp.ApiVersioning;
using Volo.Abp.AspNetCore.Mvc.Conventions; using Volo.Abp.AspNetCore.Mvc.Conventions;
@ -20,6 +21,7 @@ using Volo.Abp.AspNetCore.Mvc.Json;
using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.Localization;
using Volo.Abp.AspNetCore.VirtualFileSystem; using Volo.Abp.AspNetCore.VirtualFileSystem;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;
using Volo.Abp.Http.Modeling; using Volo.Abp.Http.Modeling;
using Volo.Abp.Localization; using Volo.Abp.Localization;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
@ -38,6 +40,10 @@ namespace Volo.Abp.AspNetCore.Mvc
{ {
public override void PreConfigureServices(ServiceConfigurationContext context) public override void PreConfigureServices(ServiceConfigurationContext context)
{ {
DynamicProxyIgnoreTypes.IgnoreTypes.AddIfNotContains(typeof(ControllerBase));
DynamicProxyIgnoreTypes.IgnoreTypes.AddIfNotContains(typeof(PageModel));
DynamicProxyIgnoreTypes.IgnoreTypes.AddIfNotContains(typeof(ViewComponent));
context.Services.AddConventionalRegistrar(new AbpAspNetCoreMvcConventionalRegistrar()); context.Services.AddConventionalRegistrar(new AbpAspNetCoreMvcConventionalRegistrar());
} }

3
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingInterceptorRegistrar.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Linq; using System.Linq;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;
namespace Volo.Abp.Auditing namespace Volo.Abp.Auditing
{ {
@ -8,7 +9,7 @@ namespace Volo.Abp.Auditing
{ {
public static void RegisterIfNeeded(IOnServiceRegistredContext context) public static void RegisterIfNeeded(IOnServiceRegistredContext context)
{ {
if (ShouldIntercept(context.ImplementationType)) if (ShouldIntercept(context.ImplementationType) && !DynamicProxyIgnoreTypes.Contains(context.ImplementationType))
{ {
context.Interceptors.TryAdd<AuditingInterceptor>(); context.Interceptors.TryAdd<AuditingInterceptor>();
} }

3
framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AuthorizationInterceptorRegistrar.cs

@ -3,6 +3,7 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;
namespace Volo.Abp.Authorization namespace Volo.Abp.Authorization
{ {
@ -10,7 +11,7 @@ namespace Volo.Abp.Authorization
{ {
public static void RegisterIfNeeded(IOnServiceRegistredContext context) public static void RegisterIfNeeded(IOnServiceRegistredContext context)
{ {
if (ShouldIntercept(context.ImplementationType)) if (ShouldIntercept(context.ImplementationType) && !DynamicProxyIgnoreTypes.Contains(context.ImplementationType))
{ {
context.Interceptors.TryAdd<AuthorizationInterceptor>(); context.Interceptors.TryAdd<AuthorizationInterceptor>();
} }

24
framework/src/Volo.Abp.Core/Volo/Abp/DynamicProxy/DynamicProxyIgnoreTypes.cs

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Volo.Abp.DynamicProxy
{
/// <summary>
/// Castle's dynamic proxy class feature will have performance issues for some components, such as the controller of Asp net core MVC.
/// For related discussions, see: https://github.com/castleproject/Core/issues/486 https://github.com/abpframework/abp/issues/3180
/// The Abp framework may enable interceptors for certain components (UOW, Auditing, Authorization, etc.), which requires dynamic proxy classes, but will cause application performance to decline.
/// We need to use other methods for the controller to implement interception, such as middleware or MVC / Page filters.
/// So we provide some ignored types to avoid enabling dynamic proxy classes.
/// By default it is empty. When you use middleware or filters for these components in your application, you can add these types to the list.
/// </summary>
public static class DynamicProxyIgnoreTypes
{
public static List<Type> IgnoreTypes { get; } = new List<Type>();
public static bool Contains(Type type, bool includeDerivedTypes = true)
{
return includeDerivedTypes ? IgnoreTypes.Any(t => t.IsAssignableFrom(type)) : IgnoreTypes.Contains(type);
}
}
}

3
framework/src/Volo.Abp.Features/Volo/Abp/Features/FeatureInterceptorRegistrar.cs

@ -2,6 +2,7 @@
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;
namespace Volo.Abp.Features namespace Volo.Abp.Features
{ {
@ -9,7 +10,7 @@ namespace Volo.Abp.Features
{ {
public static void RegisterIfNeeded(IOnServiceRegistredContext context) public static void RegisterIfNeeded(IOnServiceRegistredContext context)
{ {
if (ShouldIntercept(context.ImplementationType)) if (ShouldIntercept(context.ImplementationType) && !DynamicProxyIgnoreTypes.Contains(context.ImplementationType))
{ {
context.Interceptors.TryAdd<FeatureInterceptor>(); context.Interceptors.TryAdd<FeatureInterceptor>();
} }

3
framework/src/Volo.Abp.Uow/Volo/Abp/Uow/UnitOfWorkInterceptorRegistrar.cs

@ -1,5 +1,6 @@
using System.Reflection; using System.Reflection;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;
namespace Volo.Abp.Uow namespace Volo.Abp.Uow
{ {
@ -7,7 +8,7 @@ namespace Volo.Abp.Uow
{ {
public static void RegisterIfNeeded(IOnServiceRegistredContext context) public static void RegisterIfNeeded(IOnServiceRegistredContext context)
{ {
if (UnitOfWorkHelper.IsUnitOfWorkType(context.ImplementationType.GetTypeInfo())) if (UnitOfWorkHelper.IsUnitOfWorkType(context.ImplementationType.GetTypeInfo()) && !DynamicProxyIgnoreTypes.Contains(context.ImplementationType))
{ {
context.Interceptors.TryAdd<UnitOfWorkInterceptor>(); context.Interceptors.TryAdd<UnitOfWorkInterceptor>();
} }

3
framework/src/Volo.Abp.Validation/Volo/Abp/Validation/ValidationInterceptorRegistrar.cs

@ -1,4 +1,5 @@
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;
namespace Volo.Abp.Validation namespace Volo.Abp.Validation
{ {
@ -6,7 +7,7 @@ namespace Volo.Abp.Validation
{ {
public static void RegisterIfNeeded(IOnServiceRegistredContext context) public static void RegisterIfNeeded(IOnServiceRegistredContext context)
{ {
if (typeof(IValidationEnabled).IsAssignableFrom(context.ImplementationType)) if (typeof(IValidationEnabled).IsAssignableFrom(context.ImplementationType) && !DynamicProxyIgnoreTypes.Contains(context.ImplementationType))
{ {
context.Interceptors.TryAdd<ValidationInterceptor>(); context.Interceptors.TryAdd<ValidationInterceptor>();
} }

4
framework/test/Volo.Abp.Authorization.Tests/Volo/Abp/Authorization/AbpAuthorizationTestModule.cs

@ -1,6 +1,7 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Authorization.TestServices; using Volo.Abp.Authorization.TestServices;
using Volo.Abp.Autofac; using Volo.Abp.Autofac;
using Volo.Abp.DynamicProxy;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
namespace Volo.Abp.Authorization namespace Volo.Abp.Authorization
@ -13,7 +14,8 @@ namespace Volo.Abp.Authorization
{ {
context.Services.OnRegistred(onServiceRegistredContext => context.Services.OnRegistred(onServiceRegistredContext =>
{ {
if (typeof(IMyAuthorizedService1).IsAssignableFrom(onServiceRegistredContext.ImplementationType)) if (typeof(IMyAuthorizedService1).IsAssignableFrom(onServiceRegistredContext.ImplementationType) &&
!DynamicProxyIgnoreTypes.Contains(onServiceRegistredContext.ImplementationType))
{ {
onServiceRegistredContext.Interceptors.TryAdd<AuthorizationInterceptor>(); onServiceRegistredContext.Interceptors.TryAdd<AuthorizationInterceptor>();
} }

4
framework/test/Volo.Abp.FluentValidation.Tests/Volo/Abp/FluentValidation/ApplicationService_FluentValidation_Tests.cs

@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
using Shouldly; using Shouldly;
using Volo.Abp.Autofac; using Volo.Abp.Autofac;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Testing; using Volo.Abp.Testing;
using Volo.Abp.Validation; using Volo.Abp.Validation;
@ -108,7 +109,8 @@ namespace Volo.Abp.FluentValidation
{ {
context.Services.OnRegistred(onServiceRegistredContext => context.Services.OnRegistred(onServiceRegistredContext =>
{ {
if (typeof(IMyAppService).IsAssignableFrom(onServiceRegistredContext.ImplementationType)) if (typeof(IMyAppService).IsAssignableFrom(onServiceRegistredContext.ImplementationType) &&
!DynamicProxyIgnoreTypes.Contains(onServiceRegistredContext.ImplementationType))
{ {
onServiceRegistredContext.Interceptors.TryAdd<ValidationInterceptor>(); onServiceRegistredContext.Interceptors.TryAdd<ValidationInterceptor>();
} }

4
framework/test/Volo.Abp.Validation.Tests/Volo/Abp/Validation/ApplicationService_Validation_Tests.cs

@ -8,6 +8,7 @@ using Shouldly;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Autofac; using Volo.Abp.Autofac;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Testing; using Volo.Abp.Testing;
using Xunit; using Xunit;
@ -198,7 +199,8 @@ namespace Volo.Abp.Validation
{ {
context.Services.OnRegistred(onServiceRegistredContext => context.Services.OnRegistred(onServiceRegistredContext =>
{ {
if (typeof(IMyAppService).IsAssignableFrom(onServiceRegistredContext.ImplementationType)) if (typeof(IMyAppService).IsAssignableFrom(onServiceRegistredContext.ImplementationType) &&
!DynamicProxyIgnoreTypes.Contains(onServiceRegistredContext.ImplementationType))
{ {
onServiceRegistredContext.Interceptors.TryAdd<ValidationInterceptor>(); onServiceRegistredContext.Interceptors.TryAdd<ValidationInterceptor>();
} }

Loading…
Cancel
Save