gpt4 book ai didi

c# - Autofac拦截目标方法

转载 作者:行者123 更新时间:2023-11-30 15:26:46 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com