具有类型参数的Autofac DynamicProxy

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有类型参数的Autofac DynamicProxy相关的知识,希望对你有一定的参考价值。

我想使用Autofac的类型拦截来缓存方法结果。

我用下面的代码注册了我的类型

builder.RegisterAssemblyTypes(dependentAssemblies)
            .Where(x => x.GetCustomAttributes(typeof(InterceptAttribute), true).Any())
            .WithParameters(parameters)
            .AsImplementedInterfaces()
            .EnableInterfaceInterceptors()
            .InstancePerRequest();

它工作正常。但这是Interface拦截。当我注册类型时

builder.RegisterAssemblyTypes(dependentAssemblies)
            .Where(x => x.GetCustomAttributes(typeof(InterceptAttribute), true).Any())
            .WithParameters(parameters)
            .AsImplementedInterfaces()
            .EnableClassInterceptors()
            .InstancePerRequest();

我收到错误

使用可用的服务和参数可以调用在'Castle.Proxies.MyServiceProxy'类型上找到'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'的构造函数:无法解析构造函数'Void .ctor'的参数'System.String' (Castle.DynamicProxy.IInterceptor [],System.String,System.String,NLog.ILogger)'。

我的参数列表在两种情况下都相同,并且足以创建MyService并且看起来像

var parameters = new[]
        {
            new NamedParameter("name1", "value1"),
            new NamedParameter("name2", "value2")
        };

我忘记了什么吗?

答案

拦截器围绕着服务(As<T>部分),而不是组件(具体的东西被注册)。您将事物注册为接口,但是您没有启用接口拦截,您正在启用类拦截。没有任何课程可以拦截。

也可以将.AsSelf()添加到该注册声明或切换回EnableInterfaceInterceptors()

以上是关于具有类型参数的Autofac DynamicProxy的主要内容,如果未能解决你的问题,请参考以下文章

autoFac——茴字的三种写法

Autofac之自动装配

使用 Autofac 创建具有依赖关系的类的实例

根据运行时会话值从 Autofac 解析服务实现

Autofac没有用参数击中构造函数

IoC容器Autofac正篇之类型注册