Как сказать Windsor добавить перехватчик для всех зарегистрированных компонентов, которые реализуют IMustBeIntercepted - PullRequest
5 голосов
/ 07 января 2009

Если я зарегистрировал несколько компонентов в Windsor.

IAnimal предоставляет BigAnimal IPerson предоставляет SmellyPerson IWhale обеспечивает BlueWhale

и т. Д. Довольно стандартная регистрация компонентов

все вышеперечисленные типы реализуют IMustBeIntercepted, как я могу сказать контейнеру добавить перехватчик для всех типов, которые реализуют IMustBeImplemented так, чтобы при вызове Resolve возвращался BigAnimal с перехватчиком, как определено, поскольку он соответствует. Я знаю, что могу сделать это для каждого, но его дополнительный XML-конфиг или программный конфиг, которого я хочу избежать

Ответы [ 2 ]

5 голосов
/ 22 января 2009

Просто создайте интерфейс, подобный этому:

public interface IMustBeIntercepted {}

и подобный объект:

public class InterceptionFacility : AbstractFacility {
    protected override void Init() {
        Kernel.ComponentRegistered += new Castle.MicroKernel.ComponentDataDelegate(Kernel_ComponentRegistered);
    }

    void Kernel_ComponentRegistered(string key, Castle.MicroKernel.IHandler handler) {
        if(typeof(IMustBeIntercepted).IsAssignableFrom(handler.ComponentModel.Implementation)) {
            handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(TestInterceptor)));
        }
    }
}

Затем зарегистрируйте объект в контейнере, используя тег <facility>. Теперь все компоненты, которые реализуют IMustBeIntercepted, будут перехвачены перехватчиком TestInterceptor.

2 голосов
/ 09 апреля 2009

Только что написал этот ребенок:

    public static BasedOnDescriptor WithInterceptor(this BasedOnDescriptor reg, string interceptorComponentName) {
        return reg.Configure(x=> x.Configuration(
                Child.ForName("interceptors").Eq(
                    Child.ForName("interceptor").Eq(
                        "${" + interceptorComponentName + "}"
                ))));
    }
...