如何在有构造函数参数的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中,有多种方法可以修改拦截管道。
发布于 2018-12-15 08:16:38
目前,这在Autofac.Extras.DynamicProxy中是不可能的。您可以不使用拦截器选择器,而是从注册的元数据属性(由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>();这是一个更多的手册,但它可能会带你去你要去的地方。
https://stackoverflow.com/questions/53784205
复制相似问题