난 당신이 무슨 오해 생각합니다. 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),
난 당신이 어디에서 오는지 볼 수 있지만, 나는 영업 이익으로 그 방법에 바인딩 문제가있는 것이라고 생각
은'Kernel.InterceptReplace (foo는 => foo.ThrowsAnError(), ...);'거기에 인수를 입력해야합니다. 그렇지 않으면 ThrowsAnError가 N 개의 인수를 필요로하므로 컴파일 할 필요가 없습니다. 예를 들어 생각하면 B *처럼 생각해야합니다. 'Kernel.InterceptReplace (foo => foo.ThrowsAnError (somehowSatisfyParam1, somehowSatisfyParam2), ...); '나는 잘못 될 수 있습니다. –
Grofit
Grofit이 정확하다.'foo.ThrowsAnError()'는 여전히 params가 규정 될 것이라고 기대할 것이다. –
@MarkWalsh : Ahh, I see. 내 업데이트를 참조하십시오. – Steven