2011-02-01 6 views
3

キャッスルウィンザーをDIに使用すると、同じインターフェースを実装する2つのクラスがあります。それに加えて、独自のメソッドとプロパティがあります。私はCastle DynamicProxyを使用しており、Castle.Facilities.LoggingLoggingFacilityを介してLog4Netを使用していくつかのロギングを行うインターセプタを作成しました。城ウィンザーインターセプターなしのインターフェイスですか?

ログファイルは、そのメソッドが呼び出されると、インターフェイス経由で実装された各メソッドをきれいに記録します。以下のサンプルコードでは、メソッド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

あなたは方法は、仮想作ると、そのクラスのプロキシが生成されますので、(最初の)サービスとしてクラスを公開しない限り、それは不可能です。しかし、これは壊れた抽象化の匂いがする。 FooIFooとすると、LogMeTooは決して呼ばれません。何もログする必要はありません。

+1

あなたの答えをありがとう。メソッドをバーチャルにしてクラスをサービスとして公開する方法については、ドキュメントを参照できますか?壊れた抽象化について:私の実際のコードでは、Bar()は新しいバックグラウンドスレッドでLogMeToo()を起動し、そのときに傍受したい。 – KBoek

関連する問題