АОП с использованием классов Windsor и массовой регистрации - PullRequest
3 голосов
/ 03 января 2012

Я пытаюсь настроить приложение так, чтобы типы из AssemblyA могли использоваться моей консолью для регистрации в стиле AOP.JournalInterceptor будет просто записывать вызовы методов, вводить и, возможно, выводить аргументы в файл журнала или хранилище данных какого-либо рода.

Я могу зарегистрировать один тип за один раз, но я бы хотел зарегистрировать все типы за один раз.Как только я начинаю, я могу добавить некоторую фильтрацию к зарегистрированным типам, но мне чего-то не хватает.

Я пытаюсь использовать Classes.FromAssemblyContaining, но не уверен, как получить экземпляр IRegistration для вызоваWindsorContainer::Register

Есть какие-нибудь подсказки?

// otherAssembly.cs
namespace assemblyA
{
  public class Foo1 { public virtual void What(){} }
  public class Foo2 { public virtual void Where(){} }
}
// program.cs
namespace console
{
  using assemblyA;

  public class JournalInterceptor : IInterceptor {}

  public class Program
  {
     public static void Main()
     {
        var container = new Castle.Windsor.WindsorContainer()
            .Register(
                Component.For<JournalInterceptor>().LifeStyle.Transient,
                // works but can't be the best way
                Component.For<Foo1>().LifeStyle.Transient
                    .Interceptors<JournalInterceptor>(),
                Component.For<Foo2>().LifeStyle.Transient,
                    .Interceptors<JournalInterceptor>(),
                // how do I do it this way
                Classes.FromAssemblyContaining<Foo1>()
                        .Pick()
                        .LifestyleTransient()
                        .Interceptors<JournalInterceptor>()
                      );

        Foo1 foo = container.Resolve<Foo1>();
     }
  }
}

1 Ответ

4 голосов
/ 04 января 2012

Реализация Pointcut .В Castle Windsor это делается путем реализации интерфейса IModelInterceptorsSelector.

Это будет выглядеть примерно так:

public class JournalPointcut : IModelInterceptorsSelector
{
    public bool HasInterceptors(ComponentModel model)
    {
        return true; // intercept everything - probably not a good idea, though
    }

    public InterceptorReference[] SelectInterceptors(
        ComponentModel model, InterceptorReference[] interceptors)
    {
        return new[] 
        {
            InterceptorReference.ForType<JournalInterceptor>()
        }.Concat(interceptors).ToArray();
    }
}

Затем зарегистрируйте Interceptor и Pointcut в контейнере:

this.container.Register(Component.For<JounalInterceptor>());

this.container.Kernel.ProxyFactory.AddInterceptorSelector(new JournalPointcut());

Для более подробного объяснения вы можете посмотреть эту запись .

...