首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Autofac EnableClassInterceptors

Autofac EnableClassInterceptors
EN

Stack Overflow用户
提问于 2017-10-10 05:24:33
回答 1查看 834关注 0票数 1

我无法使Autofac EnableClassInterceptors工作。不过,我已经能够让EnableInterfaceInterceptors工作了。我想用它来记录。

有人能看出我做错了什么吗?

我就是这样注册类型的:

代码语言:javascript
复制
 var builder = new ContainerBuilder();
 builder.RegisterType<ReceiverManager>()
        .EnableClassInterceptors()
        .InterceptedBy(typeof(MethodCallLogger));
 builder.Register(c => new MethodCallLogger());

这是我要截取的类型:

代码语言:javascript
复制
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)
    {
    ...
    }
}

我是这样解析组件的:

代码语言:javascript
复制
builder.RegisterType<ReceiverManager>()
       .As<IManageQueueReceivers>();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-10 11:17:49

通过做

代码语言:javascript
复制
builder.RegisterType<ReceiverManager>()
       .EnableClassInterceptors()
       .InterceptedBy(typeof(MethodCallLogger));

您正在将一个ReceiverManager注册为它本身,当您解析一个ReceiverManager时,它将被MethodCallLogger拦截。

ie:

代码语言:javascript
复制
scope.Resolve<ReceiverManager>()
     .DoSomething()

DoSomething方法将被MethodCallLogger拦截

通过添加

代码语言:javascript
复制
builder.RegisterType<ReceiverManager>()
       .As<IManageQueueReceivers>();

您正在注册一个新组件为IManageQueueReceivers。在本例中,您将有两个注册,一个用于ReceiverManager (将被MethodCallLogger截获),另一个用于IManageQueueReceivers

如果解析IManageQueueReceivers,拦截器就不会应用。

EnableInterfaceInterceptorsEnableClassInterceptors的区别在于Autofac将如何提供类型。在第一种情况下,Autofac将在接口上创建代理,因此接口声明的每个方法都将被截获,而在第二种情况下,Autofac将创建一个子类型,因此每个虚拟方法都将被截获。

在这两种情况下,您只能拦截由解析类型声明的方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46659135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档