2010-02-24 3 views
1

나는 약간의 문제가있다. Castle Windsor IOC Container에서 일하고 있습니다. 이제 내가하고 싶었던 것은 AOP 원리를 망쳐 놓은 것 뿐이고, 특히 로깅을 수행하는 메서드 이름을 기반으로하고 싶습니다. 나는 인터셉터를보고 있었고, 현재 IInterceptor 인터페이스를 사용하여이 로깅을 수행하는 클래스로 구현했다. 문제는 내가 메서드 이름 등을 확인하기 위해 구현 된 aspect에 어떤 로직을 넣어야하기 때문에 특정 메소드에 대한 로깅을 수행하려고하면 지저분해진다. ...윈저 컨테이너의 Castle Dynamic Proxy

나는 할 수 있다는 것을 읽었다. 이 모든 것은 동적 프록시와 IInterceptorSelector 인터페이스와 IProxyGenerationHook 인터페이스를 사용합니다. 나는 그물에 행해진 이것의 약간보기를 보았다 그러나 나는 모두가 Windsor 콘테이너로 어떻게에 맞는지 아주 혼동된다. 내 코드에서 실제로 모든 개체를 만들려면 IWindsorContainer 인터페이스에 대한 ref입니다 윈저 컨테이너를 사용하고 있음을 의미합니다. 모든 구성은 XML이 아닌 코드로 수행됩니다.

처음에는 누구나 내가 현재하고있는 방식 외에 윈저 컨테이너에서 메서드 특정 AOP를 수행하는 방법을 알고 있습니다.

둘째, 윈도 센서 컨테이너에서 동적 프록시를 어떻게 사용합니까? 나는 내 프록시를 생성하고 인터셉터

 ProxyGenerator _generator = new ProxyGenerator(new PersistentProxyBuilder()); 
     IInterceptorSelector _selector = new CheckLoggingSelector(); 
     var loggingAspect = new LoggingAspect(); 
     var options = new ProxyGenerationOptions(new LoggingProxyGenerationHook()) { Selector = _selector }; 
     var proxy = _generator.CreateClassProxy(typeof(TestClass), options, loggingAspect); 
     TestClass testProxy = proxy as TestClass; 

     windsorContainer.Register(
     Component.For<LoggingAspect>(), 
     Component.For<CheckLoggingAspect>(), 
     Component.For<ExceptionCatchAspect>(), 
     Component.For<ITestClass>() 
      .ImplementedBy<TestClass>() 
      .Named("ATestClass") 
      .Parameters(Parameter.ForKey("Name").Eq("Testing")) 
      .Proxy.MixIns(testProxy)); 

테스트 클래스 내 클래스를 등록하고 코드를 추가 한 아래

은 다음과 같습니다 : 그들이 인터셉터에 대한 같은

public class TestClass : ITestClass 
{ 
    public TestClass() 
    { 

    }   

    public string Name 
    { 
     get; 
     set; 
    } 
    public void Checkin() 
    { 
     Name = "Checked In"; 
    } 
} 

아주 간단하고 이름이 Check로 시작하면 메소드를 입력하십시오.

이제 TestClass를 컨테이너에서 해결할 때 오류가 발생합니다.

은 { "이것은 DynamicProxy2 오류입니다 : 믹스 인 타입 TestClassProxy는 DynamicProxy 기반 인터페이스입니다 IProxyTargetAccessor를 구현하고 당신은 스스로를 구현해서는 안 기존 프록시 믹스 위해 노력하고 있습니다.?"}

난 내가 알고 잘못된 방법으로 프록시를 사용하고 있지만 윈저 컨테이너에 프록시를 사용하는 방법에 대한 구체적인 예를 보지 못했기 때문에 혼란 스러울 수 있습니다.

내가 "LoggingProxyGenerationHook"을 사용하기를 원한다면 요격기가 먼저 "check"라는 단어로 시작하는 메소드를 먼저 알려준 다음 올바른 방법을 사용하거나 완전히 잘못된 경로에 있습니다. 나는 매우 강력한 것처럼 보이기 때문에 프록시 방식으로 내려 갔고 향후 프로그래밍 작업에이 프록시를 사용하는 방법을 알고 싶습니다.

+0

동적 프록시를 Windsor 컨테이너와 함께 사용하는 방법을 명확히하기 위해 위의 구성에서 작동하도록 동적 프록시를 만드는 방법이나 동적 프록시가 완전히 다르게 작동하고 완전히 잘못 되었습니까? 감사합니다. – Iffy

+0

ExceptionCatchAspect는 이미 DynamicProxy 인터셉터입니다. –

+0

오, 그래서 동적 프록시를 사용하고 있습니다. 동적 프록시 객체가 실제로 만들어지고 인터셉터가 주입 된 예제를 보았습니다. 이 경우 코드에서 특정 측면을 어떻게 수행 할 것인가? 나는 이것이 IInterceptorSelector와 IProxyGenerationHook 인터페이스를 사용한다고 가정하지만, 동적 프록시의 새로운 인스턴스를 생성해야한다는 것을 보았고 이것이 윈저 컨테이너로 다시 연결되는 방식을 이해하지 못한다. 감사합니다. – Iffy

답변

3

.Interceptors()을 사용하면 이미 동적 프록시를 사용하고 있습니다. 구성 요소가 인터셉터를 지정하면 Windsor는 프록시를 생성하고 이러한 인터셉터를 사용합니다. 메서드 .SelectedWith.Proxy 속성을 사용하여 DynamicProxy에서 이미 알고있는 다른 옵션을 설정할 수도 있습니다.

I just added a website about Windsor AOP to documentation wiki. 아직 많이 없지만 I (및 Mauricio;))는 필요한 모든 정보를 제공합니다. 한번보세요. 모든 것이 명확하고 빠진 것이 있으면 알려주세요.

+0

고마워요. 이 작업을 올바르게 수행했는지 확신 할 수 없지만 먼저 새 프록시를 선언하고 Proxy.MixIns (..) 메서드를 사용하여 테스트 클래스와 함께 사용하도록 설정했습니다. 이제 클래스는 성공적으로 등록하지만 난 컨테이너에서이를 해결하려고 할 때 같이 오류가 발생합니다 : 가 { "이것은 DynamicProxy2 오류입니다 : 믹스 인 타입 TestClassProxy이 IProxyTargetAccessor 구현하는 DynamicProxy 인프라 인터페이스 및 구현해서는 안 자신을 기존의 프록시에서 혼합하려고합니까?}} 클래스 등록에 새 프록시를 첨부하려면 어떻게해야합니까? – Iffy

+0

글쎄, 예외 오류가 거의 모든 것을 말하는 것을 알지? 서비스가 프록시입니다. 믹스 인, 인터셉터 등을 표시하는 덕분에 프록시로 만들 수 있습니다. 따라서 기존 프록시를 프록시하려는 구성 요소와 섞지 마십시오. 그러면이 오류가 발생할 수 있습니다. 그게 확실한가요? 나에게 코드를 보여줘. –

+0

안녕하세요, 나는 간단한 질문을 포함하도록 제 질문을 던졌습니다. 다른 모든 등록 정보를 제거하고 프록시를 첨부하려고하는 클래스를 하나 남겼습니다. 이 프록시 물건은 실제로 어떤 이유로 나를 혼란스럽게합니다. 고마워요. Iffy – Iffy