6

차단을위한 자습서에서 메소드를 대상 지정하고 차단할 수 있다는 것을 알았습니다. 나는. ThrowsAnError이 문자열을 매개 변수로 받아 들여 경우Ninject 매개 변수를 사용하는 메소드 레벨 차단

Kernel.Bind<Foo>().ToSelf(); 
Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(), invocation => {}); 

문서는/당신이 차단하려는 방법은 매개 변수를 가지고있는 경우에 무엇을 포함하지 않는 튜토리얼 즉. 나는 이것에 대해 잘못된 방향으로 가고 있는지 너무 궁금했다 PARAMS에 대한 액세스 권한이없는 바인딩의시

Kernel.Bind<Foo>().ToSelf(); 
Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(**param goes here**), invocation => {}); 

?

편집

Working example

답변

3

난 당신이 무슨 오해 생각합니다. Foo 개체는 인터셉터가 포함 된 데코레이터로 대체됩니다. 즉

public class FooDecorator : Foo 
{ 
    private readonly Foo decorated; 

    public FooDecorator(Foo foo) { this.decorated = foo; } 

    public void ThrowsAnError(object param1, int param2) 
    { 
     // calls the decorated instance with supplied parameters 
     this.decorated.ThrowsAnError(param1, param2); 
    } 
} 

가 해결 된 푸가 호출 될 때 제공되는 매개 변수가 장식 된 인스턴스에 전달됩니다 : 여기에 간단한 예입니다.

그러나 인터셉터를 사용하면이 작업이 모두 간접적 (더 느린)이지만 개념은 같습니다. 나는 Ninject 차단에 익숙하지 않다는 것을 인정해야하지만 invocation 개체에는 아마도 Proceed 메서드가있을 것입니다. Expression<Action<T>>로, 같은를 나는 InterceptReplace<T> 방법의 첫 번째 인수가 위임 아니라고 생각

Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(), 
    invocation => 
    { 
     try 
     { 
      // calls the decorated instance with supplied parameters 
      invocation.Proceed(); 
     } 
     catch (Exception ex) 
     { 
      Kernel.Get<ILogger>().Log(ex); 
     } 
    }); 

UPDATE

하지만, 식 트리 : 즉, 다음과 같이해야합니다. 이 메소드는 실제로 호출되지 않지만 인터셉트 할 메소드를 찾기 위해 분석됩니다. 즉, 메서드가 호출되지 않으므로 사용자는 어떤 인수를 제공 할 수 있습니다. 트릭은 C# 컴파일러가 어떤 메소드 오버로드 (있을 경우)를 사용할 것인지 알려주는 것입니다. 당신이 쓰레기를 공급한다면 그것은 중요하지 않습니다. 두 인수가 참조 형식 인 경우,이 아마 작동합니다

Kernel.InterceptReplace<Foo>(foo => foo.ThrowsAnError(null, null), 
난 당신이 어디에서 오는지 볼 수 있지만, 나는 영업 이익으로 그 방법에 바인딩 문제가있는 것이라고 생각
+1

은'Kernel.InterceptReplace (foo는 => foo.ThrowsAnError(), ...);'거기에 인수를 입력해야합니다. 그렇지 않으면 ThrowsAnError가 N 개의 인수를 필요로하므로 컴파일 할 필요가 없습니다. 예를 들어 생각하면 B *처럼 생각해야합니다. 'Kernel.InterceptReplace (foo => foo.ThrowsAnError (somehowSatisfyParam1, somehowSatisfyParam2), ...); '나는 잘못 될 수 있습니다. – Grofit

+1

Grofit이 정확하다.'foo.ThrowsAnError()'는 여전히 params가 규정 될 것이라고 기대할 것이다. –

+1

@MarkWalsh : Ahh, I see. 내 업데이트를 참조하십시오. – Steven