C# Castle拦截器:如何向所有注册类型添加拦截器?
我正在逐一注册几种类型:C# Castle拦截器:如何向所有注册类型添加拦截器?,c#,castle-windsor,aop,interceptor,castle-dynamicproxy,C#,Castle Windsor,Aop,Interceptor,Castle Dynamicproxy,我正在逐一注册几种类型: container.Register( Component.For<IService1>().ImplementedBy<ServiceImpl1>(), Component.For<IService2>().ImplementedBy<ServiceImpl2>(), Component.For<IService3>().ImplementedBy<ServiceImpl3
container.Register(
Component.For<IService1>().ImplementedBy<ServiceImpl1>(),
Component.For<IService2>().ImplementedBy<ServiceImpl2>(),
Component.For<IService3>().ImplementedBy<ServiceImpl3>(),
Component.For<IService4>().ImplementedBy<ServiceImpl4>()
);
无数次
谢谢 使用ComponentModel contributor时,您将如何指定.SelectedWith? 通过这样做,我可以为所有方法添加拦截器
public class MyContributor : IContributeComponentModelConstruction
{
public void ProcessModel(IKernel kernel, ComponentModel model)
{
model.Dependencies.Add(new DependencyModel(DependencyType.Service, null, typeof(MyInterceptor), false));
model.Interceptors.AddFirst(InterceptorReference.ForType<MyInterceptor>());
}
}
如前所述,这可以通过使用定制来实现
首先,请注意
...
.Interceptors(InterceptorReference.ForType<DummyInterceptor>())
.SelectedWith(new FooInterceptorSelector())
.Anywhere
所以它看起来像
container.Register(Component.For<DummyInterceptor>().LifestyleTransient());
using Castle.Core;
using Castle.MicroKernel;
using Castle.MicroKernel.ModelBuilder;
...
public class InterceptorContributor : IContributeComponentModelConstruction
{
private readonly InterceptorReference interceptor;
public InterceptorContributor(InterceptorReference interceptor)
{
this.interceptor = interceptor;
}
public void ProcessModel(IKernel kernel, ComponentModel model)
{
if (...)
{
model.Interceptors.Add(interceptor)
}
}
}
或者,如果您希望能够一次性注册多个拦截器,可以利用拦截器Descriptor的现有实现,而是:
using System;
using Castle.Core;
using Castle.MicroKernel;
using Castle.MicroKernel.ModelBuilder;
using Castle.MicroKernel.ModelBuilder.Descriptors;
...
public class InterceptorsContributor : IContributeComponentModelConstruction
{
private readonly Predicate<ComponentModel> predicate;
private readonly IComponentModelDescriptor interceptorsDescriptor;
public InterceptorsContributor(Predicate<ComponentModel> predicate, params InterceptorReference[] interceptors)
{
this.predicate = predicate ?? throw new ArgumentNullException(nameof(predicate));
interceptorsDescriptor = new InterceptorDescriptor(interceptors);
}
public void ProcessModel(IKernel kernel, ComponentModel model)
{
if (predicate.Invoke(model))
{
interceptorsDescriptor.BuildComponentModel(kernel, model);
interceptorsDescriptor.ConfigureComponentModel(kernel, model);
}
}
}
或者直接使用InterceptorSelectorDescriptor:
using System;
using Castle.Core;
using Castle.DynamicProxy;
using Castle.MicroKernel;
using Castle.MicroKernel.ModelBuilder;
using Castle.MicroKernel.ModelBuilder.Descriptors;
...
public class InterceptorSelectorContributor : IContributeComponentModelConstruction
{
private readonly Predicate<ComponentModel> predicate;
private readonly IComponentModelDescriptor interceptorSelectorDescriptor;
public InterceptorSelectorContributor(Predicate<ComponentModel> predicate, IInterceptorSelector selector)
{
this.predicate = predicate ?? throw new ArgumentNullException(nameof(predicate));
var selectorRef = new InstanceReference<IInterceptorSelector>(selector);
interceptorSelectorDescriptor = new InterceptorSelectorDescriptor(selectorRef);
}
public void ProcessModel(IKernel kernel, ComponentModel model)
{
if (predicate.Invoke(model))
{
interceptorSelectorDescriptor.BuildComponentModel(kernel, model);
interceptorSelectorDescriptor.ConfigureComponentModel(kernel, model);
}
}
}
model.Implementation包含我的对象的方法列表,但是我如何只为一些方法添加拦截器呢?Dan,这是一个问题,不是答案。请把它作为一个单独的问题来问。它实际上和OP是同一个问题,答案只是部分的
using System;
using Castle.Core;
using Castle.MicroKernel;
using Castle.MicroKernel.ModelBuilder;
using Castle.MicroKernel.ModelBuilder.Descriptors;
...
public class InterceptorsContributor : IContributeComponentModelConstruction
{
private readonly Predicate<ComponentModel> predicate;
private readonly IComponentModelDescriptor interceptorsDescriptor;
public InterceptorsContributor(Predicate<ComponentModel> predicate, params InterceptorReference[] interceptors)
{
this.predicate = predicate ?? throw new ArgumentNullException(nameof(predicate));
interceptorsDescriptor = new InterceptorDescriptor(interceptors);
}
public void ProcessModel(IKernel kernel, ComponentModel model)
{
if (predicate.Invoke(model))
{
interceptorsDescriptor.BuildComponentModel(kernel, model);
interceptorsDescriptor.ConfigureComponentModel(kernel, model);
}
}
}
public void ProcessModel(IKernel kernel, ComponentModel model)
{
if (...)
{
var options = model.ObtainProxyOptions();
options.Selector = new InstanceReference<IInterceptorSelector>(selector);
}
}
using System;
using Castle.Core;
using Castle.DynamicProxy;
using Castle.MicroKernel;
using Castle.MicroKernel.ModelBuilder;
using Castle.MicroKernel.ModelBuilder.Descriptors;
...
public class InterceptorSelectorContributor : IContributeComponentModelConstruction
{
private readonly Predicate<ComponentModel> predicate;
private readonly IComponentModelDescriptor interceptorSelectorDescriptor;
public InterceptorSelectorContributor(Predicate<ComponentModel> predicate, IInterceptorSelector selector)
{
this.predicate = predicate ?? throw new ArgumentNullException(nameof(predicate));
var selectorRef = new InstanceReference<IInterceptorSelector>(selector);
interceptorSelectorDescriptor = new InterceptorSelectorDescriptor(selectorRef);
}
public void ProcessModel(IKernel kernel, ComponentModel model)
{
if (predicate.Invoke(model))
{
interceptorSelectorDescriptor.BuildComponentModel(kernel, model);
interceptorSelectorDescriptor.ConfigureComponentModel(kernel, model);
}
}
}