Castle Windsor Interceptor 是否有可能只拦截 class 中的特定方法而忽略其他方法?
Is possible with Castle Windsor Interceptor to intercept only a specific method in a class and ignore the other ones?
亲爱的,
我有一个接口 IJob,它有一个名为 ExecuteAsync 的方法,我想拦截此方法 only 但是我派生的 类 可能有很多方法,我发现拦截器也拦截了它们。
我的问题是,
温莎城堡有可能吗
这是我的注册
iocManager.IocContainer.Kernel.ComponentRegistered += (key, handler) =>
{
var implementationType = handler.ComponentModel.Implementation.GetTypeInfo();
if(ShouldIntercept(implementationType))
{
handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(AuthenticateJobInterceptor)));
}
};
private static bool ShouldIntercept(Type type)
{
if (typeof(IJob).IsAssignableFrom(type))
{
return true;
}
return false;
}
是的。您可以实现一个 IProxyGenerationHook
接口来控制拦截的内容。 The tutorial I wrote a decade ago 仍然(无论好坏)似乎是最好的资源。
在 Windsor 中有几种设置方法。
理想情况下,如果可能的话,您会在注册时在 IWindsorInstaller
:
var yourHook = new YourHook();
container.Register(
Classes.FromThisAssembly()
.BasedOn<IJob>()
.LifestyleTransient()
.WithServiceBase()
.Configure(c =>
c.Interceptors<AuthenticateJobInterceptor>()
.Proxy.Hook(yourHook)));
或者,如果您想让您的代码与现在的代码相似(我建议用 ComponentModel construction contributor 包装起来),您可以这样做:
var options = handler.ComponentModel.ObtainProxyOptions();
options.Hook = yourHook; // InstanceReference(yourHook)
亲爱的, 我有一个接口 IJob,它有一个名为 ExecuteAsync 的方法,我想拦截此方法 only 但是我派生的 类 可能有很多方法,我发现拦截器也拦截了它们。 我的问题是, 温莎城堡有可能吗 这是我的注册
iocManager.IocContainer.Kernel.ComponentRegistered += (key, handler) =>
{
var implementationType = handler.ComponentModel.Implementation.GetTypeInfo();
if(ShouldIntercept(implementationType))
{
handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(AuthenticateJobInterceptor)));
}
};
private static bool ShouldIntercept(Type type)
{
if (typeof(IJob).IsAssignableFrom(type))
{
return true;
}
return false;
}
是的。您可以实现一个 IProxyGenerationHook
接口来控制拦截的内容。 The tutorial I wrote a decade ago 仍然(无论好坏)似乎是最好的资源。
在 Windsor 中有几种设置方法。
理想情况下,如果可能的话,您会在注册时在 IWindsorInstaller
:
var yourHook = new YourHook();
container.Register(
Classes.FromThisAssembly()
.BasedOn<IJob>()
.LifestyleTransient()
.WithServiceBase()
.Configure(c =>
c.Interceptors<AuthenticateJobInterceptor>()
.Proxy.Hook(yourHook)));
或者,如果您想让您的代码与现在的代码相似(我建议用 ComponentModel construction contributor 包装起来),您可以这样做:
var options = handler.ComponentModel.ObtainProxyOptions();
options.Hook = yourHook; // InstanceReference(yourHook)