编程语言
首页 > 编程语言> > c#-Autofac拦截目标方法

c#-Autofac拦截目标方法

作者:互联网

我正在使用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 
    }

它确实并没有增加太多的开销,但是感觉仍然很糟糕.特别是由于将其添加到特定的服务实现中意味着它将拦截基类通用实现的所有方法调用.如果它仅拦截派生类,那也不会太糟.

我看到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,您应该只有一个钩子实例.

使用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));

标签:aop,interceptor,castle-dynamicproxy,c,autofac
来源: https://codeday.me/bug/20191028/1953803.html