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);
        }
    }
}