2014-09-25 6 views
0

MVC 4 프로젝트 및 Ninject 3 모든 유선 있습니다..net MVC 컨트롤러 차단 Ninject 함께

이제 MVC Controller 메서드에서 가로 채기를 처리하려고합니다.

내가 추가하는 경우이 :

(내 자신의 방법이 차단되지 않지만, 대신에 내가 BeginExecute, EndExecute을 얻고 기본 컨트롤러 클래스의 차단 방법을 폐기하더라도)은 좀 작동
kernel.Bind<TT.Controllers.HomeController>().ToSelf().Intercept().With<TT.Interceptors.LoggingInterceptor>(); 

. 하지만 지금은 괜찮다고 해봅시다.

나는이처럼 내 HomeController의 특정 방법을 차단하려면

는 :

kernel.InterceptAround<TT.Controllers.HomeController>(
       c => c.Index(), 
       invocation => doSomethingOnEnter(invocation), 
       invocation => doSomethingOnExit(invocation) 
       ); 

그것은 단순히 작동하지 않습니다. 차단은 결코 해고되지 않습니다.

한편, 내 프로젝트의 일부 일반 서비스 클래스에서 동일한 메소드 차단을 사용하면 작동합니다. 컨트롤러 메소드 만 가로채는 문제가있는 것 같습니다.

kernel.InterceptAround<UrlService>(
        c => c.DoSomething(), 
        invocation => doSomethingOnEnter(invocation), 
        invocation => doSomethingOnExit(invocation) 
        ); 

^이 작동합니다.

아무도 모르게해야합니까?

추신. 나는 WebActivators와 NinjectWebCommon 사용하고 있습니다 :

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(TT.NinjectWebCommon), "Start")] 
[assembly: WebActivatorEx.ApplicationShutdownMethodAttribute(typeof(TT.NinjectWebCommon), "Stop")] 

답변

0

차단을 위해 Linfu 또는 성 동적 프록시 중 하나를 사용하는 Ninject에 차단 확장은 만의 또는 인터페이스 프록시의 경우, 모든 방법을 가상있는 방법을 가로 챌 수 있습니다 인터페이스 this 성 동적 프록시 "프록시 객체의 종류"개요를보아야합니다.

그러나 추가 제한 사항은 외부 메서드라고 불리는 메서드 만 가로 챌 수 있다는 것입니다. 메서드가 객체에 의해 호출되면 자체적으로 차단이 작동하지 않습니다. 프록시가 Bar()하지만 하지ReallyDoIt()를 가로 챌 것

public class Foo 
{ 
    public virtual void Bar() 
    { 
     this.ReallyDoIt(); 
    } 

    public virtual void ReallyDoIt() 
    { 

    } 
} 

Foo f; 
f.Bar(); 

을 그리고 당신은 kernel.Get<Foo>().Bar();을 수행

예를 들어, 당신은 할 거라고합니다.

설명대로 기본 컨트롤러 클래스는 doSomethingOnEnterdoSomethingOnExit 메서드를 호출합니다. 이전에 언급했듯이이 방법은 효과가 없습니다.

+1

여기에있는 속임수는 콘크리트 컨트롤러 대신 IController에 인터셉터를 적용하는 것입니다. 이 작업을 수행하려면 사용자 정의 컨트롤러 팩토리를 구현하고 등록해야 할 수도 있습니다. – Steven