c# - Autofac拦截目标方法

标签 c# aop autofac interceptor castle-dynamicproxy

我正在使用 Autofac.Extras.DynamicProxy2 对服务实现执行一些方法拦截。

该服务有很多方法,我只想针对其中几个。

除了根据我要拦截的方法的已批准字符串字典检查调用目标名称之外,还有更好的做法吗?

   public void Intercept(IInvocation invocation)
    {
        invocation.Proceed();
        if (ContinueIntercept(invocation))
        {
            // Do intercept work
        }
    }

    private bool ContinueIntercept(IInvocation invocation)
    {            
        // Logic to compare invocation.MethodInvocationTarget.Name 
    }

它确实没有增加太多开销,但感觉仍然是一种糟糕的方式。特别是因为将此添加到特定服务实现意味着它将拦截基类公共(public)实现的所有方法调用。如果它只拦截派生类就不会那么糟糕。

我看到 CaSTLe.DynamicProxy2 有指定调用目标的方法,但我不知道如何将它与 autofac 连接起来。

最佳答案

您可以使用 IProxyGenerationHook 来指定 ProxyBuilder 应该在哪个方法上生成代理。

public class FooProxyGenerationHook : IProxyGenerationHook
{
    public void MethodsInspected()
    { }

    public void NonProxyableMemberNotification(Type type, MemberInfo memberInfo)
    { }

    public Boolean ShouldInterceptMethod(Type type, MethodInfo methodInfo)
    {
        if (type == typeof(Foo) && methodInfo.Name == "Do")
        {
            return true;
        }
        return false;
    }
}

然后,你可以这样注册:

    ProxyGenerator generator = new ProxyGenerator();
    FooProxyGenerationHook hook = new FooProxyGenerationHook();
    IFoo foo = generator.CreateClassProxyWithTarget<Foo>(new Foo(), new ProxyGenerationOptions(hook), new FooInterceptor());

为了避免为每个代理调用 IProxyGenerationHook,您应该只有一个 hook 实例。

使用 DynamicProxy2,您可以使用此代码:

    FooProxyGenerationHook hook = new FooProxyGenerationHook();

    ContainerBuilder builder = new ContainerBuilder();
    builder.RegisterType<FooInterceptor>().AsSelf();
    builder.RegisterType<Foo>().As<IFoo>()
            .EnableClassInterceptors(new ProxyGenerationOptions(hook))
            .InterceptedBy(typeof(FooInterceptor));

关于c# - Autofac拦截目标方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28749070/

相关文章:

c# - 如何在 C# Express 中选择 32 位或 64 位构建?

C#套接字编程

java - 如何在方面调用 Hook 类的方法?

c# - 使用 PostSharp 添加 OnException 属性

c# - Autofac 解决 CQRS CommandDispatcher 中的依赖关系

c# - 没有直接在类中实现的接口(interface)的实际用法是什么?

c# - DataGrid - 更改编辑行为

c# - 我可以在运行时使用属性有条件地控制方法调用吗?

autofac - 具有运行时构造函数参数的键控委托(delegate)工厂?

c# - 在 Startup.cs 中使用 DI 解析服务