我正在迁移,并且遇到异常。 Autofac可以从服务提供商的实例解析我的服务,但在请求时无法在我的控制器中获取它。
Exception: Castle.DynamicProxy.ProxyGenerationException:这是一个DynamicProxy2错误:代理的目标类型实现Castle.DynamicProxy.IProxyTargetAccessor是一个DynamicProxy基础结构接口,您决不要自己实现F。您是否要代理现有的代理?
我的AutoregistrableModule看起来像这样:
public class AutoregisterableModule : Autofac.Module
{
private readonly string _nameFilter;
/// <summary>
/// Default ctor
/// </summary>
/// <param name="nameFilter">Load will only search assemblies with names that contains filter</param>
public AutoregisterableModule(string nameFilter)
{
_nameFilter = nameFilter;
}
/// <summary>
/// Register's dependencies
/// </summary>
protected override void Load(ContainerBuilder builder)
{
var assemblies = new List<Assembly>();
var dependencies = DependencyContext.Default.RuntimeLibraries.Where(x => x.Name.Contains(_nameFilter));
foreach (var library in dependencies)
{
var assembly = Assembly.Load(new AssemblyName(library.Name));
assemblies.Add(assembly);
}
builder.Register(c => new LogInterceptor()).InstancePerLifetimeScope();
var isProd = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Production";
var containerBuilder = builder.RegisterAssemblyTypes(assemblies.ToArray())
.Where(TypesToRegisterFilter)
.PreserveExistingDefaults()
.AsImplementedInterfaces();
if (!isProd)
{
containerBuilder.EnableInterfaceInterceptors();
}
base.Load(builder);
}
private static bool TypesToRegisterFilter(Type type)
{
return !type.IsSubclassOf(typeof(SwaggerConfigureOptions)) && !typeof(BackgroundService).IsAssignableFrom(type);
}
}
如果我删除该行,则一切正常(我的LoggerInterceptor除外:D)
containerBuilder.EnableInterfaceInterceptors();
我的服务看起来像
[Intercept(typeof(LogInterceptor))]
public class CategoriesService : ICategoriesService
{
// some code here
}
我曾建议通过将Autofac.Extensions.DependencyInjection软件包从6.0.0降级为5.0.1,如建议的there来解决此问题,但没有帮助。
您可以在https://pastebin.com/YCAhLQv0中找到完整的Stacktrace。
所以问题是如何解决该异常并使我的拦截器正常工作?
通过将Autofac.Extras.DynamicProxy软件包版本从4.5.0升级到5.0.0修复。希望它可以帮助某人。