我无法使Autofac EnableClassInterceptors工作。不过,我已经能够让EnableInterfaceInterceptors工作了。我想用它来记录。
有人能看出我做错了什么吗?
我就是这样注册类型的:
var builder = new ContainerBuilder();
builder.RegisterType<ReceiverManager>()
.EnableClassInterceptors()
.InterceptedBy(typeof(MethodCallLogger));
builder.Register(c => new MethodCallLogger());这是我要截取的类型:
public class ReceiverManager : IManageQueueReceivers
{
public ReceiverManager(IReceiverHandlerFactory handlerFactory, IListenQueueMessageFactory<QueueMessage> listenerFactory, IBuildQueuePath pathBuilder, ICreateQueue queueCreator, ITestQueueConnection<QueueMessage> connectionTester, ISendRetry<QueueMessage> retrySender, IProcessDeadLetter deadLetterProcessor, ILogger logger)
{
...
}
public virtual void CreateReceivers(IEnumerable<QueueConfiguration> queueConfigurationList)
{
...
}
public virtual INormalReceiver NormalReceiver(string queuePath, QueueConfiguration configuration)
{
...
}
public virtual IReceiver RetryReceiver(string queuePath, QueueConfiguration configuration)
{
...
}
public virtual void CreateReceiver(QueueConfiguration configuration, Func<string, QueueConfiguration, IReceiver> receiver, bool testConnection = true)
{
...
}
}我是这样解析组件的:
builder.RegisterType<ReceiverManager>()
.As<IManageQueueReceivers>();发布于 2017-10-10 11:17:49
通过做
builder.RegisterType<ReceiverManager>()
.EnableClassInterceptors()
.InterceptedBy(typeof(MethodCallLogger));您正在将一个ReceiverManager注册为它本身,当您解析一个ReceiverManager时,它将被MethodCallLogger拦截。
ie:
scope.Resolve<ReceiverManager>()
.DoSomething()DoSomething方法将被MethodCallLogger拦截
通过添加
builder.RegisterType<ReceiverManager>()
.As<IManageQueueReceivers>();您正在注册一个新组件为IManageQueueReceivers。在本例中,您将有两个注册,一个用于ReceiverManager (将被MethodCallLogger截获),另一个用于IManageQueueReceivers。
如果解析IManageQueueReceivers,拦截器就不会应用。
EnableInterfaceInterceptors和EnableClassInterceptors的区别在于Autofac将如何提供类型。在第一种情况下,Autofac将在接口上创建代理,因此接口声明的每个方法都将被截获,而在第二种情况下,Autofac将创建一个子类型,因此每个虚拟方法都将被截获。
在这两种情况下,您只能拦截由解析类型声明的方法。
https://stackoverflow.com/questions/46659135
复制相似问题