2014-10-17 3 views
2

Я довольно новичок в Castle Windsor и, в частности, с помощью Interceptors, и мне интересно, можно ли зарегистрировать Interceptor во всех реализациях определенного интерфейса, не указав каждую реализацию в свою очередь , Например, у меня есть интерфейс под названием IComponent, который будет реализован рядом классов. У меня есть класс ComponentInterceptor, написанный для работы над этими классами, когда он выполнил конкретный метод. Я хотел бы сделать что-то вроде:Регистрация перехватчика для всех интерфейсов Реализация в Castle Windsor

_container.Register(
Component.For<IComponent>() 
        .Interceptors("ComponentInterceptor") 
        .LifestyleSingleton()) 

Вместо того, чтобы сделать:

 _container.Register(
     Component.For<IComponent>() 
       .ImplementedBy<ComponentA>() 
       .Interceptors("ComponentInterceptor") 
       .LifestyleSingleton()), 
    _container.Register(
     Component.For<IComponent>() 
       .ImplementedBy<ComponentB>() 
       .Interceptors("ComponentInterceptor") 
       .LifestyleSingleton()) 

ответ

2

Я нашел другой подход, я хотел зарегистрировать этот перехватчик для всех зарегистрированных компонентов и сделать это, надеюсь, минимальным шумом. Для этого я следую this article и создал новый класс, как это:

public class MyContributeComponentConstruct : IContributeComponentModelConstruction 
{ 
    public void ProcessModel(IKernel kernel, ComponentModel model) 
    { 
     if (model.Services.Any(s => s == typeof(IComponent))) 
     { 
      model.Interceptors.Add(InterceptorReference.ForType<ComponentInterceptor>()); 
     } 
    } 
} 

, а затем добавить этот вклад с замок Виндзор контейнера

container.Kernel.ComponentModelBuilder.AddContributor(new MyContributeComponentConstruct()); 
+1

вкладчиком другой подход. Хотя вы не должны получать обработчики и добавлять такого перехватчика, как вызывающий вкладчик, когда регистрируется каждый компонент. Вы должны только модифицировать предоставленную «модель», иначе ваши компоненты получат несколько экземпляров перехватчика. Я обновил ваш ответ, чтобы отразить это. –

2

Вы можете зарегистрировать компоненты в контейнере с помощью конвенций через Classes класса. Следующие регистры все классы в текущей сборке, которые реализуют IComponent в рамках услуги IComponent и с ComponentInterceptor перехватчиком:

container.Register(
    Classes.FromThisAssembly() 
     .BasedOn<IComponent>() 
     .WithService.FromInterface() 
     .Configure(c => c.Interceptors<ComponentInterceptor>()) 
); 

Windsor documentation предоставляет кучу других примеров и подробно объясняют, что различные классы для.

Смежные вопросы