2012-01-03 43 views
3

我想配置一個應用程序,使得來自assemblyA的類型可以被我的控制檯使用,以允許以AOP樣式進行日誌記錄。 JournalInterceptor將只寫出方法調用,輸入和輸出參數給某種日誌文件或數據存儲。使用Windsor和批量註冊類的AOP

我可以一次註冊一種類型,但我想一次註冊所有類型。一旦我開始,我可能會添加一些過濾到註冊類型,但我錯過了一些東西。

我試圖用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>(); 
    } 
    } 
} 

回答

4

執行Pointcut。在溫莎城堡,這是通過實施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(); 
    } 
} 

然後用容器註冊的攔截器和切入點:

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

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

如需更深入的解釋,你可能希望看到this recording

+0

謝謝,這工作後,我篩選出我想要的日記爲哪些服務(通過自定義屬性)。我會盡快觀看視頻會議。 – 2012-01-04 10:05:07

相關問題