2011-02-01 83 views
3

使用Castle Windsor進行DI,我有兩個類實現相同的接口;除此之外還有其自己的一些方法和屬性。我正在使用Castle DynamicProxy並創建了一個攔截器,它將通過Castle.Facilities.LoggingLoggingFacility對Log4Net進行一些日誌記錄。Castle Windsor Interceptor w/o Interface?

當調用該方法時,日誌文件整齊地記錄每個通過接口實現的方法。在下面的示例代碼中,方法Foo()在被調用時被記錄,但方法LogMeToo()不會被使用,因爲它不是IFoo實現的一部分。

我想這也是其他方法不實現該接口時被調用時記錄。這是可能的,如果是這樣的話:怎麼樣?

public interface IFoo 
{ 
    void Bar(); 
}
[Interceptor(typeof(LoggingInterceptor))] public class Foo : IFoo { public void Bar() { // Do Something }
public void LogMeToo() { // Do Something } }
public static class Program { [STAThread] public static void Start() { var container = new WindsorContainer();
container.Register(Component.For<LoggingInterceptor>().LifeStyle.Transient); container.Register(Component.For<IFoo>().ImplementedBy<Foo>());
container.AddFacility<LoggingFacility>(f => f.LogUsing(LoggerImplementation.Log4net).WithConfig("Log4net.config")); } }
WPF C#4.0

回答

3

不,除非你的方法虛擬和使類代理獲取生成公開該類作爲一個(第一)服務是不可能的。然而,這味道像抽象的破碎。如果您將Foo曝光爲IFoo,那麼LogMeToo將永遠不會被調用 - 無需記錄任何內容。

+1

感謝您的回答。你能否指點我有關如何使方法變爲虛擬並將類作爲服務公開的文檔?至於破碎的抽象:在我的真實代碼中,Bar()在新的後臺線程中啓動LogMeToo(),並且當發生這種情況時我想攔截。 – KBoek 2011-02-02 09:51:54