c# - Autofac 启用类拦截器

标签 c# autofac

我无法让 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>();

最佳答案

通过做

builder.RegisterType<ReceiverManager>()
       .EnableClassInterceptors()
       .InterceptedBy(typeof(MethodCallLogger));

你正在注册一个 ReceiverManager 本身,当你解析一个 ReceiverManager 时,它会被 MethodCallLogger 拦截

即:

scope.Resolve<ReceiverManager>()
     .DoSomething()

DoSomething 方法将被 MethodCallLogger 拦截

通过添加

builder.RegisterType<ReceiverManager>()
       .As<IManageQueueReceivers>();

您正在将新组件注册为 IManageQueueReceivers。在这种情况下,您将有 2 个注册,一个用于 ReceiverManager(将被 MethodCallLogger 拦截),一个用于 IManageQueueReceivers

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

EnableInterfaceInterceptorsEnableClassInterceptors 之间的区别在于 Autofac 提供类型的方式。在第一种情况下,Autofac 将在接口(interface)上创建一个代理,因此接口(interface)声明的每个方法都将被拦截,而在第二种情况下,Autofac 将创建一个子类型,因此每个虚方法都将被拦截。

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

关于c# - Autofac 启用类拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46659135/

相关文章:

c# - 获取 Autofac 中接口(interface)的所有注册实现

autofac - 如果在 Autofac 中找不到匹配的寄存器,如何使用默认类进行解析

asp.net-mvc - Autofac 在具有混合 MVC 的 AppBuilder.Map block 中使用 Owin Web API 设置

c# - 'awaited'任务在哪里执行?

c# - 如何优化此 LINQ to EF/Sql 查询(多对多关系)?

c# - 在 .Net 4.5 中使用 Websocket 的示例

c# - 如何在 Repository 中注入(inject) EntityFramework Core DbContext

c# - 使用 svc-less 服务的 Autofac WCF 注册异常

c# - 是否可以将属性作为 "out"或 "ref"参数传递?

c# - 如何通过 Form Action 传递数据 - WebService (WCF) 中的 "POST"?