gpt4 book ai didi

c# - 如何在 Autofac InterceptorSelector 的构造函数中使用具有参数的拦截器

转载 作者:行者123 更新时间:2023-12-04 15:51:17 27 4
gpt4 key购买 nike

如何在具有构造函数参数的 IInterceptorSelector.SelectInterceptors 方法中使用拦截器。我想让 Autofac 使用它的参数解析我的拦截器,就像在这个 CaSTLe 框架中一样:

InterceptorReference.ForType<CallLogger>()

我对此进行了研究,但一无所获。

这是从示例中提取的示例代码:

class Program
{
static void Main(string[] args)
{
var builder = new ContainerBuilder();
var proxyGenerationOptions = new ProxyGenerationOptions();

//I want to use this
//proxyGenerationOptions.Selector = new InterceptorSelector();

builder.RegisterType<SomeType>()
.As<ISomeInterface>()
.EnableInterfaceInterceptors(proxyGenerationOptions)

.InterceptedBy(typeof(CallLogger));//and remove explicit statement

builder.Register<TextWriter>(x => Console.Out);

builder.RegisterType<CallLogger>().AsSelf();

var container = builder.Build();

var willBeIntercepted = container.Resolve<ISomeInterface>();
willBeIntercepted.Work();
}
}

public class InterceptorSelector : IInterceptorSelector
{
public IInterceptor[] SelectInterceptors(Type type, MethodInfo method, IInterceptor[] interceptors)
{
//don't know how to solve dependency here, because it's registration time
return new IInterceptor[] { /* new CallLogger(dependency) or InterceptorReference.ForType<CallLogger>() */};
}
}

public class CallLogger : IInterceptor
{
TextWriter _output;

public CallLogger(TextWriter output)
{
_output = output;
}

public void Intercept(IInvocation invocation)
{
invocation.Proceed();

_output.WriteLine("Done: result was {0}.", invocation.ReturnValue);
}
}

public interface ISomeInterface { void Work(); }

public class SomeType : ISomeInterface { public void Work() { } }

我也想知道,Autofac中有没有动态拦截分配机制。在CaSTLe中,有多种方法可以修改拦截管道。

最佳答案

目前这在 Autofac.Extras.DynamicProxy 中是不可能的。你可以see in the source拦截器是从注册的元数据属性中检索的(由 IntereceptedBy 放置),而不是使用拦截器选择器。

我们有one user note你可以连接你自己的拦截器做这样的事情:

builder.RegisterType<Implementation>().AsSelf();
builder.Register(c =>
{
ProxyGenerator proxyGen = new ProxyGenerator(true);
return proxyGen.CreateInterfaceProxyWithTargetInterface<IInterfaceOfImplementation>(
c.Resolve<Implementation>(),
c.Resolve<ExceptionCatcherInterceptor>());
}).As<IInterfaceOfImplementation>();

这有点手动,但它可能会带您到达目的地。

I've added an enhancement issue对此进行调查。

关于c# - 如何在 Autofac InterceptorSelector 的构造函数中使用具有参数的拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53784205/

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