2011-02-01 2 views
3

DI 용 Castle Windsor를 사용하여 동일한 인터페이스를 구현하는 두 가지 클래스가 있습니다. 그 외에는 그들 만의 몇 가지 방법과 속성이 있습니다. 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

관련 문제